我试图将引用xml转换为其他特定于dtd的
输入:
<ref>
<a>text</a>
<b>text</b>
<c>text</c>
<d>text</d>
</ref>
XSLT:
<xsl:template match="ref">
<ref>
<h>
<xsl:apply-templates select="./a"/>
</h>
<g>
<xsl:apply-templates />
</g>
</ref>
</xsl:template>
<xsl:template match="ref/a">
<a>
<xsl:apply-templates />
</a>
</xsl:template>
输出派生:
<ref>
<h>
<a>text</a>
</h>
<g>
<a>text</a>
<b>text</b>
<c>text</c>
<d>text</d>
</g>
</ref>
期望的输出:
<ref>
<h>
<a>text</a>
</h>
<g>
<b>text</b>
<c>text</c>
<d>text</d>
</g>
</ref>
我应该使用模式来执行此操作还是应该调用模板,如果是这样的话。
答案 0 :(得分:0)
我怀疑这更像是你想做的事情:
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ref">
<ref>
<h>
<xsl:apply-templates select="./*[1]"/>
</h>
<g>
<xsl:apply-templates select="./*[generate-id() != generate-id(../*[1])]"/>
</g>
</ref>
</xsl:template>
<xsl:template match="ref/*">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
答案 1 :(得分:0)
而不是
<g>
<xsl:apply-templates />
</g>
使用
<g>
<xsl:apply-templates select="node() except a"/>
</g>
在XSLT 2.0中
答案 2 :(得分:0)
最后使用'模式'来完成它。
<xsl:template match="ref">
<ref>
<h>
<xsl:apply-templates select="./a" mode="add"/>
</h>
<g>
<xsl:apply-templates />
</g>
</ref>
</xsl:template>
<xsl:template match="ref/a"/>
<xsl:template match="ref/a" mode="add">
<a>
<xsl:apply-templates />
</a>
</xsl:template>