应用模板未按预期工作

时间:2014-07-11 21:21:39

标签: xslt

我正在尝试使用模板实现一个XSL逻辑。对于所有Test元素,我需要添加一个父标记“Result”

<xsl:stylesheet exclude-result-prefixes="xs" version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="Test">
    <RESULT>
        <xsl:copy-of select="."/>
    </RESULT>
    <xsl:apply-templates select="node()"/>
</xsl:template>
</xsl:stylesheet>

输入XML:

<?xml version="1.0" encoding="UTF-8"?>
<Test>
<goal>
    Books
</goal>
<secret>
    <Test>
        Noodles
    </Test>        
</secret>
</Test>

预期产出:

<Output>
<RESULT>
  <Test>
     <goal>Books</goal>
     <secret>
        <Test>Noodles</Test>
     </secret>
  </Test>
</RESULT>
<RESULT>
  <Test>Noodles</Test>
</RESULT>
</Output>

实际输出:

<Output>
<RESULT>
  <Test>
     <goal>Books</goal>
     <secret>
        <Test>Noodles</Test>
     </secret>
  </Test>
</RESULT>
Books
<RESULT>
  <Test>Noodles</Test>
</RESULT>
Noodles
</Output>

我在输出中得到一个额外的文本。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

由于XSLT's built in rules,您获得了额外的文字输出。

您可以通过添加此模板来覆盖文本的内置规则:

<xsl:template match="text()"/>

如果您只是使用xsl:copy-of和/或xsl:value-of,这将正常工作。如果您依靠text()输出的内置规则,则必须修改替换或更改select中的xsl:apply-templates(已经提供了一个选项)作者:Sivaa Nethaji)。