【问题标题】:xpath/xslt to determine index of context node relative to all nodes of same name?xpath/xslt 确定上下文节点相对于所有同名节点的索引?
【发布时间】:2010-03-27 12:20:02
【问题描述】:

鉴于下面的架构 - 以“查询”节点作为上下文,是否可以使用 xpath/xslt 确定该“查询”节点相对于文档中所有“查询”节点的索引(不是 position()相对于它的直接兄弟)。

TIA,

杰夫

<section>
    <name>About</name>
    <link>about</link>
    <questions>
        <question>
            <query>Question 1</query>
            <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer>
        </question>
    </questions>
</section>

<section>
    <name>Contact</name>
    <link>contact</link>
    <questions>
        <question>
            <query>Question 1</query>
            <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer>
        </question>
        <question>
            <query>Question 2</query>
            <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer>
        </question>
    </questions>
</section>

【问题讨论】:

  • 好问题 (+1)。有一个非常短的单行 XPath 表达式可以为您提供想要的结果——请参阅我的回答。 :)

标签: xml xslt xpath


【解决方案1】:

使用

count(preceding::question)+1

此转换执行详尽的测试

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:variable name="vQs" select="//question"/>

 <xsl:template match="/">
  <xsl:for-each select="$vQs">
    <xsl:value-of select=
    "count(preceding::question)+1"/>
    <xsl:text> </xsl:text>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

当上述转换应用于以下 XML 文档时

<t>
    <section>
        <name>About</name>
        <link>about</link>
        <questions>
            <question>
                <query>Question 1</query>
                <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer>
            </question>
            <question>
                <query>Question 2</query>
                <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer>
            </question>
        </questions>
    </section>
    <section>
        <name>Contact</name>
        <link>contact</link>
        <questions>
            <question>
                <query>Question 3</query>
                <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer>
            </question>
            <question>
                <query>Question 4</query>
                <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer>
            </question>
            <question>
                <query>Question 5</query>
                <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer>
            </question>
        </questions>
    </section>
</t>

产生了想要的结果:

1 2 3 4 5 

【讨论】:

  • 不错!我不知道那件事。当然比我尝试做的更容易。
  • @jwismar,很高兴你喜欢这个答案。用赞成票表达这一点怎么样? :)
猜你喜欢
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 2015-05-15
  • 2023-03-23
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多