名称空间前缀时XSLT失败

时间:2018-07-16 16:27:23

标签: xml xslt

对于具有名称空间的转换XML文件,我必须在XSL文件中使用此名称空间。 但这不起作用。

这是我的XML文件:

    <?xml version="1.0" encoding="utf-8"?>
<data xmlns="http://www.aspzone.com/xml/serialization">
    <parent>
        <string xmlns="">AAA</string>
    </parent>
    <nb>
        <string >2</string>
    </nb>
    <child1>aaa-1
        <s1><string >1aaa-1 </string></s1>
        <s1><string >2aaa-1</string></s1>
    </child1>
    <child1>aaa-2</child1>
    <parent>
        <string >BBB</string>
    </parent>
    <nb>
        <string>1</string>
    </nb>
    <child2>bbb-1</child2>
</data>

名称空间为“ ser”的XSL文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ser="http://www.aspzone.com/xml/serialization" >
      <xsl:output indent="yes"/>
      <xsl:template match="ser:data">
          <xsl:copy>
              <xsl:apply-templates select="ser:parent"/>
          </xsl:copy>
      </xsl:template>
      <xsl:template match="ser:parent[string = 'AAA']">
          <xsl:copy>
              <xsl:variable name="n" select="following-sibling::ser:nb[1]"/>
              <xsl:copy-of select="string | following-sibling::ser:nb[1] | following-sibling::ser:child1[position() &lt;= $n]"/>
          </xsl:copy>
      </xsl:template>
      <xsl:template match="ser:parent[string != 'AAA']">
          <xsl:copy>
              <xsl:variable name="n" select="following-sibling::ser:nb[1]"/>
              <xsl:copy-of select="string | following-sibling::ser:nb[1] | following-sibling::ser:child2[position() &lt;= $n]"/>
          </xsl:copy>
       </xsl:template>
</xsl:stylesheet>

当我使用前缀“ ser:”时,它会产生:

<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="http://www.aspzone.com/xml/serialization">
   <parent>
      <string xmlns="">AAA</string>
      <nb>
               <string>2</string>
         </nb>
      <child1>aaa-1
        <s1><string >1aaa-1</string></s1>
        <s1><string >2aaa-1</string></s1>
      </child1>
      <child1>aaa-2</child1>
   </parent>
        BBB
    </data>

预期是

    <?xml version="1.0" encoding="UTF-8"?>
<data>
   <parent>
      <string>AAA</string>
      <nb>
               <string>2</string>
         </nb>
      <child1>aaa-1
        <s1><string >1aaa-1 </string></s1>
        <s1><string >2aaa-1</string></s1>
      </child1>
      <child1>aaa-2</child1>
   </parent>
   <parent>
      <string>BBB</string>
         <nb>
               <string>1</string>
         </nb>
      <child2>bbb-1</child2>
</data>

不检索childe2节点... 怎么了 ? 当不使用名称空间时,它会很好地工作。

最诚挚的问候

2 个答案:

答案 0 :(得分:2)

  

未检索childe2节点...出了什么问题?效果很好   当不使用名称空间时。

可能是因为您的匹配ser:parent[string != 'AAA']从未匹配任何内容。

这是因为在您的第二个ser:parent中,子项string在默认名称空间http://www.aspzone.com/xml/serialization中(而string在第一个{{1 }}。

考虑改用xsl:key ...

ser:parent

提琴:http://xsltfiddle.liberty-development.net/gWmuiJr

答案 1 :(得分:0)

xsl:copy指令产生的元素名称与原始名称相同:即,相同的本地名称和相同的名称空间。因此,如果您在输入中输入{http://www.aspzone.com/xml/serialization}data,并且在输出中想要{}data(更改名称空间,并因此更改名称),则不能使用xsl:copy;您需要使用xsl:element