根据以下节点获取值

时间:2014-12-22 10:58:20

标签: xslt

我有以下的XML。

<?xml version="1.0" encoding="UTF-8"?>
<root>
<new>
This is content <star.page>21</star.page> with star pages <star.page>22</star.page> inside it.
</new>
<main>
    This is main content
</main>
</root>

在这里,我想要打印以下为main的号码,即只打印22但不打印21。

我希望从star.page模板完成此操作。就像在这里一样,21之后是22(两者都是star.page),我希望打印star.page值,其中main之后有star.page且没有中间的其他21。我在mainstar.page之间的输入中有另一个22但不在main22之间。所以我想打印21但不打印template match="star.page"。此模板必须在root内完成,但不能在{{1}}内完成。

请让我知道我哪里出错了以及如何解决。

Demo

2 个答案:

答案 0 :(得分:1)

试试这个:

XML:

<root>
<new>
This is content <star.page>21</star.page> with star pages <star.page>22</star.page> inside it.
</new>
<main>
    This is main content
</main>

</root>

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="star.page">
       <xsl:if test="following::*[name()='main'] and not(following::*[name()='star.page'])">
           <xsl:text>Last page is </xsl:text><xsl:value-of select="."/>
       </xsl:if>
</xsl:template>

<xsl:template match="*[not(name()='star.page')]/text()"/>

</xsl:stylesheet>

输出:

Last page is 22

答案 1 :(得分:0)

一种方法是在preceding导航时使用main,并找到最后star.page,而不考虑其余结构:

<xsl:value-of select="(/root/main/preceding::star.page)[position()=last()]"/>

Fiddle