如何在XSLT中获取下一个同级节点

18

我对XSLT还比较陌生,这是我的XML:

<projects>
    <project>
        <number>1</number>
        <title>Project X</title>
    </project>
    <project>
        <number>2</number>
        <title>Project Y</title>
    </project>
    <project>
        <number>3</number>
        <title>Project Z</title>
    </project>
</projects>

如果我有一个项目并想获取它后面的同级项目,我该怎么做?

这段代码对我似乎不起作用:

/projects[title="Project X"]/following-sibling
1个回答

31

实际上这是一个完全关于XPath的问题。

使用方法:

/*/project[title = 'Project X']/following-sibling::project[1]

这个选择器选取的是XML文档中顶层元素的子元素中,至少有一个title子元素内容为字符串"Project X"Project元素后面的第一个同级元素。

XSLT基于验证:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select=
      "/*/project[title = 'Project X']/following-sibling::project[1]"/>
 </xsl:template>
</xsl:stylesheet>

当对提供的 XML 文档应用此转换时:

<projects>
    <project>
        <number>1</number>
        <title>Project X</title>
    </project>
    <project>
        <number>2</number>
        <title>Project Y</title>
    </project>
    <project>
        <number>3</number>
        <title>Project Z</title>
    </project>
</projects>

评估XPath表达式并将正确选择的元素复制到输出:

<project>
   <number>2</number>
   <title>Project Y</title>
</project>

这似乎无法在 xsl:for-each 循环中工作。如何使其在循环中工作? - basZero
1
@basZero,请在使用“this”和“doesn't work”时要准确。如果没有看到您的代码以及所需实现的定义,那么期望任何人能够理解评论并提供有用的回复是不现实的。我建议您提出一个单独的、新的SO问题,正确格式化XML文档和XSLT代码,定义所需结果并提供实际结果。让我们避免猜测,节省大家的时间。 - Dimitre Novatchev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接