none
至今都未明白的xml用xslt转换完后带命名空间的问题 RRS feed

  • 问题

  • xml:

    <TestList xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Test>
        <TestBody>
          <TestRoot xmlns:cp="urn:schemas-microsoft-com/contentpublishing/content">
            <cp:TestValue type="xhtml">
              <p>aaa</p>
              <p>bbb</p>
              <div>cccc</div>
            </cp:TestValue>
          </TestRoot>    
        </TestBody>
      </Test>
    </TestList>

    xslt:

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
     xmlns:cp="urn:schemas-microsoft-com/contentpublishing/content"
                    xmlns:ms="urn:schemas-microsoft-com:xslt"
     version="1.0" >
      <xsl:output method="html" indent="yes" />
      <xsl:template match="//TestList">
        <xsl:apply-templates />
      </xsl:template>
      <xsl:template match="Test">
        <xsl:element name="div">
          <xsl:attribute name="class">testMain</xsl:attribute>
          <xsl:apply-templates select="TestBody//cp:TestValue/*" mode="cp:TestValue">
            <xsl:with-param name="node" select="." />
          </xsl:apply-templates>
        </xsl:element>
      </xsl:template>
      <xsl:template match="*|@*|text()" mode="cp:TestValue">
        <xsl:param name="node"/>  
        <xsl:copy>
          <xsl:apply-templates select="*|@*|text()" mode="cp:TestValue">
            <xsl:with-param name="node" select="$node" />
          </xsl:apply-templates>
        </xsl:copy>
      </xsl:template>
      <xsl:template match="text()" mode="cp:TestValue">
        <xsl:value-of disable-output-escaping="yes" select="." />
      </xsl:template>

    转换完后的html:

      <div class="testMain">
      <p xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:cp="urn:schemas-microsoft-com/contentpublishing/content">aaa</p>
      <p xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:cp="urn:schemas-microsoft-com/contentpublishing/content">bbb</p>
      <div xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:cp="urn:schemas-microsoft-com/contentpublishing/content">cccc</div>
    </div>

    问题点:为什么会带xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:cp="urn:schemas-microsoft-com/contentpublishing/content"这些命名空间?  在不改xml,只改xslt的情况下,如何把这些命名空间去掉??

    • 已移动 孟宪会Moderator 2010年10月14日 2:26 (发件人:.NET Framework 一般性问题讨论区)
    2010年10月13日 13:54

答案

  • 这样写

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:msxsl="urn:schemas-microsoft-com:xslt"
            xmlns:cp="urn:schemas-microsoft-com/contentpublishing/content"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:ms="urn:schemas-microsoft-com:xslt" 
            exclude-result-prefixes="cp ms msxsl xsl xsd"
     version="1.0">
     <xsl:output method="html" indent="yes" omit-xml-declaration="yes" />
     <xsl:template match="//TestList">
      <xsl:apply-templates />
     </xsl:template>
     <xsl:template match="Test">
      <xsl:element name="div">
       <xsl:attribute name="class">testMain</xsl:attribute>
       <xsl:apply-templates select="TestBody//cp:TestValue/*" mode="cp:TestValue">
        <xsl:with-param name="node" select="." />
       </xsl:apply-templates>
      </xsl:element>
     </xsl:template>
     <xsl:template match="*|text()" mode="cp:TestValue">
      <xsl:param name="node"/>
      <xsl:element name="{local-name()}">
       <xsl:apply-templates select="*|text()" mode="cp:TestValue">
        <xsl:with-param name="node" select="$node" />
       </xsl:apply-templates>
      </xsl:element>
     </xsl:template>
     <xsl:template match="text()" mode="cp:TestValue">
      <xsl:value-of disable-output-escaping="yes" select="." />
     </xsl:template>
    </xsl:stylesheet>
    


    【孟子E章】
    2010年10月19日 6:41
    版主
  • 你写错了,是

    exclude-result-prefixes="cp ms msxsl xsl xsd"

    不是

    xmlns:exclude-result-prefixes="cp ms msxsl xsl xsd"
    【孟子E章】
    2010年12月3日 0:27
    版主

全部回复

  • 这些应该是转换后的标准文件格式吧,估计只能手动删除。
    2010年10月14日 2:01
  • 加上

    <xsl:stylesheet exclude-result-prefixes="msxsl cp ms">

     

    这样

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
     xmlns:cp="urn:schemas-microsoft-com/contentpublishing/content"
                    xmlns:ms="urn:schemas-microsoft-com:xslt"
     version="1.0" exclude-result-prefixes="msxsl cp ms">


    【孟子E章】
    2010年10月14日 2:25
    版主
  • 加上<xsl:stylesheet exclude-result-prefixes="msxsl cp ms">这个也还是不行,用我上面贴出来的xslt和xml,跑出来的效果还是带命名空间了

    2010年10月14日 13:58
  • 这样写

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:msxsl="urn:schemas-microsoft-com:xslt"
            xmlns:cp="urn:schemas-microsoft-com/contentpublishing/content"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:ms="urn:schemas-microsoft-com:xslt" 
            exclude-result-prefixes="cp ms msxsl xsl xsd"
     version="1.0">
     <xsl:output method="html" indent="yes" omit-xml-declaration="yes" />
     <xsl:template match="//TestList">
      <xsl:apply-templates />
     </xsl:template>
     <xsl:template match="Test">
      <xsl:element name="div">
       <xsl:attribute name="class">testMain</xsl:attribute>
       <xsl:apply-templates select="TestBody//cp:TestValue/*" mode="cp:TestValue">
        <xsl:with-param name="node" select="." />
       </xsl:apply-templates>
      </xsl:element>
     </xsl:template>
     <xsl:template match="*|text()" mode="cp:TestValue">
      <xsl:param name="node"/>
      <xsl:element name="{local-name()}">
       <xsl:apply-templates select="*|text()" mode="cp:TestValue">
        <xsl:with-param name="node" select="$node" />
       </xsl:apply-templates>
      </xsl:element>
     </xsl:template>
     <xsl:template match="text()" mode="cp:TestValue">
      <xsl:value-of disable-output-escaping="yes" select="." />
     </xsl:template>
    </xsl:stylesheet>
    


    【孟子E章】
    2010年10月19日 6:41
    版主
  • 谢谢版主,过来好用

    2010年10月27日 10:43
  • 可以看一下下面的问题吗?

    xml:

    <TestList xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Test>
        <TestBody>
          <TestRoot xmlns:cp="urn:schemas-microsoft-com/contentpublishing/content">
            <cp:TestValue type="xhtml">
              <p>aaa</p>
              <p>bbb</p>
              <div>cccc</div>
            </cp:TestValue>
          </TestRoot>    
        </TestBody>
      </Test>
    </TestList>

    xslt:
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:cp="urn:schemas-microsoft-com/contentpublishing/content"
                    xmlns:ms="urn:schemas-microsoft-com:xslt"
                    xmlns:exclude-result-prefixes="cp ms msxsl xsl xsd"
                     version="1.0">
      <xsl:output method="html" indent="yes"/>

    <xsl:template match="//TestList">
      <xsl:call-template name="Test">
    </xsl:template>
    <xsl:template name="Test">
      <xsl:element name="div">
        <xsl:attribute name="class">testMain</xsl:attribute>
        <script type="text/javascript" src="http://im.msn.ov.yahoo.co.jp/js_flat/?source=overture_jp_pc_test&amp;ctxtId=&amp;outputCharEnc=utf8&amp;type=type1&amp;ctxtUrl=http%3a%2f%2fjpmsncflive07t%2fbedrock%2fSite%2fJPChannels%2f2%2fAspx%2fBlogArticle+NS.aspx%3farticleid%3d4109&amp;keywordCharEnc=utf8&amp;ctxtKeywords=blog"></script>
      </xsl:element>
    </xsl:template>

    转换完后的html:

    <div class="testMain">
        <script type="text/javascript" src="http://im.msn.ov.yahoo.co.jp/js_flat/?source=overture_jp_pc_test&amp;ctxtId=&amp;outputCharEnc=utf8&amp;type=type1&amp;ctxtUrl=http%3a%2f%2fjpmsncflive07t%2fbedrock%2fSite%2fJPChannels%2f2%2fAspx%2fBlogArticle+NS.aspx%3farticleid%3d4109&amp;keywordCharEnc=utf8&amp;ctxtKeywords=blog" xmlns:cp="urn:schemas-microsoft-com/contentpublishing/content" xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:exclude-result-prefixes="cp ms msxsl xsl xsd"></script>
    </div>

    问题点:

    为什么会带xmlns:cp="urn:schemas-microsoft-com/contentpublishing/content" xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:exclude-result-prefixes="cp ms msxsl xsl xsd">这些命名空间?怎样在xslt里面把这些命名空间去掉?????

    2010年12月2日 10:06
  • 你写错了,是

    exclude-result-prefixes="cp ms msxsl xsl xsd"

    不是

    xmlns:exclude-result-prefixes="cp ms msxsl xsl xsd"
    【孟子E章】
    2010年12月3日 0:27
    版主
  • 谢谢解答,
    但是上面解决的问题如果xml变成:

    <TestList xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Test>
        <TestBody>
          <TestRoot xmlns:cp="urn:schemas-microsoft-com/contentpublishing/content">
            <cp:TestValue type="xhtml">
              <div>
                <p>
                  <a href="http://listen.jp/store/musicnews_31458_all.htm">こちらも再発売中のトラベルクロックの画像</a>
                </p>
                <p>bbb</p>
                <div>cccc</div>
                <a href="http://jp.msn.com">画像</a>        
              </div>
            </cp:TestValue>
          </TestRoot>
        </TestBody>
      </Test>
    </TestList>

    Xslt:

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:msxsl="urn:schemas-microsoft-com:xslt"
            xmlns:cp="urn:schemas-microsoft-com/contentpublishing/content"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:ms="urn:schemas-microsoft-com:xslt"
            exclude-result-prefixes="cp ms msxsl xsl xsd"
     version="1.0">
      <xsl:output method="html" indent="yes" omit-xml-declaration="yes" />
      <xsl:template match="//TestList">
        <xsl:apply-templates />
      </xsl:template>
      <xsl:template match="Test">
        <xsl:element name="div">
          <xsl:attribute name="class">testMain</xsl:attribute>
          <xsl:apply-templates select="TestBody//cp:TestValue/*" mode="cp:TestValue">
            <xsl:with-param name="node" select="." />
          </xsl:apply-templates>
        </xsl:element>
      </xsl:template>
      <xsl:template match="*|text()" mode="cp:TestValue">
        <xsl:param name="node"/>
        <xsl:element name="{local-name()}">
          <xsl:apply-templates select="*|text()" mode="cp:TestValue">
            <xsl:with-param name="node" select="$node" />
          </xsl:apply-templates>
        </xsl:element>
      </xsl:template>
      <xsl:template match="text()" mode="cp:TestValue">
        <xsl:value-of disable-output-escaping="yes" select="." />
      </xsl:template>
    </xsl:stylesheet>


    生产出来的html:

    <div class="testMain">
      <div>
        <p>
          <a>こちらも再発売中のトラベルクロックの画像</a>
        </p>
        <p>bbb</p>
        <div>cccc</div>
        <a>【関連記事】こちらも再発売中のトラベルクロックの画像</a>
      </div>
    </div>

    html里面a 标签的属性不能生成???有什么好的解决方法吗?

    2010年12月3日 5:37