Объединение XSLT или выполнение foreach для 2 разных узлов - PullRequest
3 голосов
/ 08 сентября 2011

Как мы объединяем или выполняем foreach между 2 xpath одновременно

<Country>
<States>
    <State>
        <name>1</name>
        <id>California</id>
    </State>
    <State>
        <name>2</name>
        <id>Texas</id>
    </State>
    <State>
        <name>3</name>
        <id>New York</id>
    </State>
</States>
<Cities>
    <City>
        <name>3</name>
        <id>SFO</id>
    </City>
    <City>
        <name>4</name>
        <id>SAN DIEGO</id>
    </City>
    <City>
        <name>5</name>
        <id>ORLANDO</id>
    </City>
</Cities>

Я хочу просмотреть страну и штат и получить имя и идентификатор.

1 Ответ

4 голосов
/ 08 сентября 2011

Используйте оператор объединения XPath : |

/*/States/State | /*/Cities/City

Выбирает все элементы State, которые являются дочерними элементами всех элементов State, которые являются дочерними элементами верхнего элементаXML-документа , а также все City элементы, которые являются дочерними элементами всех Cities элементов, которые являются дочерними элементами верхнего элемента XML-документа.

В XSLT одинможно указать шаблон, который соответствует нескольким типам узлов, используя снова ... оператор объединения XPath ('|') как часть шаблона соответствия:

<xsl:template match=""City | State">

Это шаблонное правило соответствует любому элементу City или State.

Наконец, , вот полное преобразование, которое выводит имя и идентификатор любого City или State:

<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="City | State">
     <xsl:copy-of select="*"/>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

, когда это преобразование применяется к предоставленному XML-документу :

<Country>
    <States>
        <State>
            <name>1</name>
            <id>California</id>
        </State>
        <State>
            <name>2</name>
            <id>Texas</id>
        </State>
        <State>
            <name>3</name>
            <id>New York</id>
        </State>
    </States>
    <Cities>
        <City>
            <name>3</name>
            <id>SFO</id>
        </City>
        <City>
            <name>4</name>
            <id>SAN DIEGO</id>
        </City>
        <City>
            <name>5</name>
            <id>ORLANDO</id>
        </City>
    </Cities>
</Country>

желаемый, правильный результат получается :

<name>1</name>
<id>California</id>
<name>2</name>
<id>Texas</id>
<name>3</name>
<id>New York</id>
<name>3</name>
<id>SFO</id>
<name>4</name>
<id>SAN DIEGO</id>
<name>5</name>
<id>ORLANDO</id>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...