Xml 仅计算特定元素
编辑:抱歉,问题有点不清楚,我正在尝试返回p节点及其子节点中的所有文本,同时计算各个p节点。So指的是第一个p节点,第二个p节点,依此类推 我试图计算单个元素的出现次数,而不管它出现在xml文档的结构中的什么位置。我尝试了不同的位置和计数,无论有无循环,似乎都找不到任何有效的方法。有人知道怎么做吗 一个例子是:Xml 仅计算特定元素,xml,xslt,Xml,Xslt,编辑:抱歉,问题有点不清楚,我正在尝试返回p节点及其子节点中的所有文本,同时计算各个p节点。So指的是第一个p节点,第二个p节点,依此类推 我试图计算单个元素的出现次数,而不管它出现在xml文档的结构中的什么位置。我尝试了不同的位置和计数,无论有无循环,似乎都找不到任何有效的方法。有人知道怎么做吗 一个例子是: <text> <body> <div1> <p>abc</p> <div
<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
号码是你在这里的朋友。用这个就可以得到号码
<xsl:number select="p" level="any" />
这将输出以下内容
1) abc
2) def
3) ghi
4) jkl adam
5) mno
6) qrs
请注意,如果您有任何文本输出,请使用模板匹配文本来停止除p以外的元素中的文本。在看到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>
输出
这个问题还不清楚。期望输出中的数字代表什么?它们显然不是位置或计数。为什么在这里缺少亚当-的字符串值?请解释一下,亚当在jkl之后在场。我正在尝试提取p和所有子节点的文本。Borodin,文本节点不能有文本节点的祖先。此外,由于某些原因,您的转换不会仅显示空白文本节点。我们需要在XSLT转换中明确地消除这些限制,并且不要依赖所使用的XML解析器的行为和外部设置。@DimitreNovatchev:您所说的有意义:从逻辑上讲,文本节点只能是子轴或子轴的成员。最初我有一个祖先::*/text,实验告诉我,祖先::text使用我访问过的所有引擎是等效的。Saxon、.NET和MSXML的工作方式完全相同。对于所有空白文本节点;为什么不解决这个问题呢?这很接近,但我试着只计算p节点。如果adam没有从输出中删除,后面跟着mno qrs,这就是我要寻找的。@Borodin,祖先::text没有选择任何内容-根据定义,文本节点没有子节点。我没有看到xsl:strip-space指令——可能是在看TimC的代码。
<?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