如何仅在XPATH中选择相同节点的位置?

时间:2018-12-24 18:45:30

标签: xslt xpath

我有以下XML,我想同时匹配恒星和行星:

<stars>
 <star>sss1</star>
 <star>sss2</star>
 <planet>ppp1</planet>
 <star>sss3</star>
 <planet>ppp2</planet>
 <star>sss4</star>
</stars>

我想选择星形节点的位置而不考虑行星节点。例如。如果我在星上使用position(),将会得到以下信息:

1:sss1

2:sss2

4:sss3

6:sss4

我只想选择星的position(),这样我得到:

1:sss1

2:sss2

3:sss3

4:sss4

使用position()函数时是否可以丢弃其他节点?

这是我正在使用的代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>

<xsl:template match="stars">
     <xsl:apply-templates />
</xsl:template>

<xsl:template match="star">
    <xsl:element name="h2">
       <xsl:attribute name="class">
           <xsl:value-of select="position()" />
       <xsl:attribute>
    </xsl:element>
</xsl:template>

<xsl:template match="planet">
<!-- do something else -->
</xsl:template>
</xsl:stylesheet>

在代码上下文中,我必须匹配出现的恒星和行星。我不能例如:

<xsl:template match="/">
    <xsl:apply-templates select="star"/>
    <xsl:apply-templates select="planet"/>
</xsl:template>

1 个答案:

答案 0 :(得分:0)

  

使用position()函数时是否可以丢弃其他节点?

否,但是有一种选择时可以丢弃其他节点的方法。例如:

XSLT 1.0

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

<xsl:template match="/stars">
    <xsl:for-each select="star">
        <xsl:value-of select="position()" />
        <xsl:text>: </xsl:text>
        <xsl:value-of select="." />
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

结果

1: sss1
2: sss2
3: sss3
4: sss4

或者,如果重要的是按原始顺序处理所有元素 ,则可以使用xsl:number代替position()-例如:

XSLT 1.0

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

<xsl:template match="/stars">
    <xsl:for-each select="*">
        <xsl:number/>
        <xsl:text>: </xsl:text>
        <xsl:value-of select="." />
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

结果

1: sss1
2: sss2
1: ppp1
3: sss3
2: ppp2
4: sss4