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

402*_*2ax 0 xslt xml-namespaces xslt-1.0

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

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

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

<bookattach xmlns:mynamespace="http://myorg.com/mymodel/Library" bookname="AA12">
<book bookname="bacbook1" description="This is test book1"/>
</bookattach>
Run Code Online (Sandbox Code Playgroud)

我不想在转换后的 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>
Run Code Online (Sandbox Code Playgroud)

pot*_*ame 5

您需要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">
Run Code Online (Sandbox Code Playgroud)

  • @4022ax XSLT _never_ 生成的前缀不 a) 出现在输入文档中或 b) 由您(样式表的作者)引入。 (2认同)
  • 当您在样式表中使用文字结果元素(如`&lt;bookattach&gt;`)时,默认情况下,该元素范围内的所有命名空间(即在样式表中的包含元素上声明)都将复制到结果中;您可以使用 exclude-result-prefixes 或使用 xsl:element 而不是文字结果元素来防止这种情况。 (2认同)