我的XML看起来像这样:
<A></A>
<A></A>
<A>
<a/>
<a/>
</A>
正如您所看到的,它有两个级别<A>
和<a>
。
我编写了XSL转换,它在每个<A>
元素上生成索引号并且它可以工作:
<xsl:template match "A">
<xsl:element name="Person">
<xsl:attribute name="id">
<xsl:number count="A"/>
</xsl:attribute>
</xsl:element>
</xsl>
输出:
<Person id="1"/>
<Person id="2"/>
<Person id="3"/>
但是如何编写xsl:number以在<a>
级别(???
)生成相同的数字?
<xsl:template match "A">
<xsl:element name="Person">
<xsl:attribute name="id">
<xsl:number count="A"/>
<xsl:apply-templates select="a"/>
</xsl:attribute>
</xsl:element>
</xsl>
<xsl:template match "a">
<xsl:element name="Item">
<xsl:attribute name="id">
<xsl:number count="???"/>
</xsl:attribute>
</xsl:element>
</xsl>
预期输出(我希望id
和<Person>
具有相同的<Item>
:
<Person id="1"/>
<Person id="2"/>
<Person id="3">
<Item id="3"/>
<Item id="3"/>
</Person>
我知道这必须是一些简单的XPATH表达式,但我真的很痴迷于此。
答案 0 :(得分:2)
如果你真的想要相同的话,你可以简单地传递计算出的数字:
<xsl:template match="A">
<xsl:variable name="id">
<xsl:number count="A"/>
</xsl:variable>
<Person id="{$id}">
<xsl:apply-templates select="a">
<xsl:with-param name="pid" select="$id"/>
</xsl:apply-templates>
</Person>
</xsl:template>
<xsl:template match="a">
<xsl:param name="pid"/>
<Item id="{$pid}"/>
</xsl:template>
答案 1 :(得分:1)
<xsl:template match "A">
<xsl:element name="Person">
<xsl:attribute name="id">
<xsl:number count="A"/>
<xsl:apply-templates select="a"/>
</xsl:attribute>
</xsl:element>
</xsl>
<xsl:template match "a">
<xsl:element name="Item">
<xsl:attribute name="id">
<xsl:number count="A" level="any"/>
</xsl:attribute>
</xsl:element>
</xsl>
添加level="any"
属性就足够了。
答案 2 :(得分:1)
在回复您的请求而不传递变量时,请参阅下文。
缺点是<xsl:number>
不能直接在属性值模板中使用(因为@Martin使用了$id
变量),因此生成id
属性变得冗长。
<xsl:template match="A">
<Person>
<xsl:attribute name="id">
<xsl:number count="A" />
</xsl:attribute>
<xsl:apply-templates select="a" />
</Person>
</xsl:template>
<xsl:template match="a">
<Item>
<xsl:attribute name="id"> <!-- I would name it personRef or something -->
<xsl:number count="A" />
</xsl:attribute>
</Item>
</xsl:template>
(未测试)。
这里的关键是在select=".."
模板中的xsl:number
上使用"a"
。 修改:事实证明select=".."
实际上并不是必需的。由于上下文节点a
与计数模式A
不匹配,因此它从最接近它的祖先开始。什么是有用的默认网络this instruction!