Как выбрать позиции тех же узлов только в XPATH? - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть следующий 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

Я хочу иметь возможность выбрать положение () только звезды, поэтому я получаю:

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 голосов
/ 25 декабря 2018

Есть ли способ отбросить другие узлы при использовании функции 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...