我有这个xml作为我的输入:
<unidad num="2.">
<tag></tag>
<tag2></tag2>
<unidad num="2.1">
<tag></tag>
<tag2></tag2>
<unidad num="2.1.1">
<tag></tag>
<tag2></tag2>
<unidad num="2.1.1.1">
<tag></tag>
<tag2></tag2>
</unidad>
</unidad>
</unidad>
</unidad>
我的输出应该是:
<sub>
<tag></tag>
<tag2></tag2>
<sub2>
<tag></tag>
<tag2></tag2>
<sub3>
<tag></tag>
<tag2></tag2>
<sub4>
<tag></tag>
<tag2></tag2>
</sub4>
</sub3>
</sub2>
</sub>
我找不到合适的方法来做到这一点。我正在使用模板,我有这个:
<xsl:for-each select="unidad">
<xsl:call-template name="unidades1"/>
</xsl:for-each>
<xsl:template name="unidades1">
<xsl:element name="sub1">
<xsl:text></xsl:text>
</xsl:element>
<xsl:if test="position() != last()">
<xsl:apply-templates select="child::*"/>
</xsl:if>
</xsl:template>
<xsl:template match="unidad">
<xsl:call-template name="unidades2"/>
</xsl:template>
<xsl:template name="unidades2">
<xsl:element name="sub2">
<xsl:text></xsl:text>
</xsl:element>
<xsl:if test="position() != last()">
<xsl:apply-templates select="child::*"/>
</xsl:if>
</xsl:template>
使用这个XSLT,unidad的每个子节点都匹配第二个条件,因此它被写为sub2,我不知道如何考虑它是否是另一个unidad元素的子节点。任何想法如何达到这个?谢谢!
答案 0 :(得分:0)
此样式表可生成所需的输出。它使用经过修改的identity transform,其中包含<unidad>
元素的专用模板。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<!--standard identity template-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="unidad">
<!--count the number of ancestors that are unidad elements-->
<xsl:variable name="unidad-ancestor-count" select="count(ancestor::unidad)"/>
<!--If there are at least one unidad ancestors then
set the suffix to be the count()+1-->
<xsl:variable name="suffix">
<xsl:if test="$unidad-ancestor-count>0">
<xsl:value-of select="$unidad-ancestor-count+1"/>
</xsl:if>
</xsl:variable>
<!--create a new element using a base name of "sub" and the suffix value -->
<xsl:element name="sub{$suffix}">
<!--not pushing the @num attribute through the identity template,
just descendant nodes-->
<xsl:apply-templates />
</xsl:element>
</xsl:template>
</xsl:stylesheet>