我正在尝试计算单个元素的出现次数,无论它出现在xml文档的结构中的哪个位置。我已尝试使用和不使用for-each循环的position()和count()的变体,似乎找不到任何可行的东西。任何人都知道如何做到这一点?
示例文档将是:
<text>
<body>
<div1>
<p>abc</p>
<div2>
<p>def</p>
</div2>
</div1>
<div1>
<p>ghi</p>
<div2>
<p>jkl <name>adam</name></p>
<div3>
<p>mno</p>
</div3>
</div2>
<p>qrs</p>
</div1>
</body>
</text>
返回:
<1>abc
<2>def
<3>ghi
<4>jkl adam
<5>mno
<6>qrs
答案 0 :(得分:0)
xsl:number
是你的朋友。只需使用它来获取数字
<xsl:number select="p" level="any" />
请注意在此实例中使用level
。
试试这个XSLT
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="p">
<xsl:number select="p" level="any" />
<xsl:value-of select="concat(') ', ., ' ')" />
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
这应输出以下内容
1) abc
2) def
3) ghi
4) jkl adam
5) mno
6) qrs
请注意使用匹配text()
的模板来停止输出p
以外的元素中的文本(如果有的话)。
答案 1 :(得分:0)
在看到Tim的回答之前,我认为您可能对任何文本节点感兴趣。
我仍然不确定你的意思是p
个节点,所以这里是我的解决方案,它列出了没有文本祖先的所有文本节点,这会产生相同的结果。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:for-each select="//*[text()][not(ancestor::text())]">
<xsl:value-of select="concat('<', position(), '> ', current(), '
')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
<强>输出强>
<1> abc
<2> def
<3> ghi
<4> jkl adam
<5> adam
<6> mno
<7> qrs