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

Remove namespace entry from element, which was added by XSLT during transformation

我正在使用 xslt 文件转换一组 xml 文件,xml 中的一些标签是用另一个名称space 定义的。

xslt 所做的是首先从 AddBooks 元素标签复制所有内容,除了 bookattach 元素 where attribute bookname = 'AA12' 然后在所有情况下构造一个新元素 bookattach where bookname="AA12" 并复制到它是 bookattach 的所有子项,其中 bookname="AA12" 和 bookname="A12".

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

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

我不想在转换后的 xml 中复制此 namespace 条目,(我的来源 xml 也不包含 bookattach 标签中的 namespace 条目), 那么我怎样才能去掉这个特定标签中的 namespace 条目呢?

我的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>

您需要在 <xsl:stylesheet> 元素上设置 exclude-result-prefixes 属性以避免在输出 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">