XSLT复制节点不起作用

时间:2013-07-04 08:57:43

标签: java xml xslt transform saxon

我想使用下面的模板完全复制一些节点:

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

所以对于以下输入:

<ext-link ext-link-type="uri" xlink:href="http://www.gnuplot.info/">http://www.gnuplot.info/</ext-link>

我会变得非常相同:

<ext-link ext-link-type="uri" xlink:href="http://www.gnuplot.info/">http://www.gnuplot.info/</ext-link>

但结果是这样的:

<ext-link>urihttp://www.gnuplot.info/http://www.gnuplot.info/</ext-link>

我正在使用Java,Saxon。

请帮助我,我做错了什么?

3 个答案:

答案 0 :(得分:2)

查看 XSLT身份转换(例如http://en.wikipedia.org/wiki/Identity_transform#Using_XSLT) 在模板匹配中添加@* 试试:

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

答案 1 :(得分:1)

我找到了另一种解决方案,我想知道你的想法。它很适合我的目的。

<xsl:copy>
   <xsl:copy-of select="@*"/>
   <xsl:apply-templates />
</xsl:copy>

答案 2 :(得分:1)

如果您真的只是想要完全按照原样复制元素及其内容,还可以选择使用

<xsl:template match="example1 | ext-link | example2">
   <xsl:copy-of select="." />
</xsl:template>

虽然hr_117使用apply-templates的推送式答案通常是首选,因为它更容易扩展。