从元素中删除命名空间条目,该条目是在转换期间由XSLT添加的

时间:2015-04-20 12:03:44

标签: xslt xslt-1.0 xml-namespaces

我使用xslt文件转换xml文件集,xml中的一些标记在另一个命名空间中定义。

xslt所做的是从AddBooks元素标签首先复制所有内容,除了bookattach元素,其中属性bookname =' AA12'然后构建一个新的元素bookattach,其中bookname =" AA12"在所有情况下,并将bookname =" AA12"的所有孩子都复制到bookattach中。和bookname =" A12"。

xslt正如预期的那样工作但问题是当它复制元素bookattach时属性bookname =' AA12'在那里添加名称空间条目。例如,它将条目复制为:

<bookattach xmlns:mynamespace="http://myorg.com/mymodel/Library" bookname="AA12">
<book bookname="bacbook1" description="This is test book1"/>
</bookattach>

我不想在转换的xml中复制此命名空间条目,(我的源xml也不包含bookattach标记中的命名空间条目), 那么如何摆脱这个特定标签中的这个命名空间条目呢?

我的xslt如下:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:mynamespace="http://myorg.com/mymodel/Library"
                version="1.0">

<xsl:output method="xml" encoding="UTF-8" indent="yes" />

    <xsl:output method="xml"/>

    <xsl:key name="bookbyid" match="mynamespace:bookattach" use="@bookname"/>

    <xsl:template match="mynamespace:AddBooks">
        <xsl:copy>
          <xsl:apply-templates select="@*|node() [ not( (self::mynamespace:bookattach and @bookname = 'AA12') )]"/>
          <bookattach bookname="AA12">
              <xsl:copy-of select="key('bookbyid','AA12')/*"/>
              <xsl:for-each select="key('bookbyid','A12')/*">
                  <xsl:if test="not(./@bookName = key('bookbyid','AA12')/*/@bookName)">
                      <xsl:copy-of select="."/>
                  </xsl:if>
              </xsl:for-each>
          </bookattach>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:4)

您需要在exclude-result-prefixes元素上设置<xsl:stylesheet>属性,以避免在输出XML中声明名称空间,如下所示:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:mynamespace="http://myorg.com/mymodel/Library"
            version="1.0"
            exclude-result-prefixes="mynamespace">