Выбор XPath - PullRequest
       31

Выбор XPath

2 голосов
/ 21 июля 2009

У меня проблемы с написанием выражения XPath для выбора узлов, содержащих определенные элементы, но исключая братьев и сестер этого элемента, которые меня не интересуют. Я подозреваю, что это невозможно сделать только с помощью XPath, и мне это понадобится использовать XSLT.

Использование этого исходного документа

<items>
    <item id="foo1">
        <attr1>val1</attr1>
        <attr2>val2</attr2>
        <attr3>val3</attr3>
        <interestingAttribute>val4</interestingAttribute>
    </item>
    <item id="foo2">
        <attr1>val5</attr1>
        <attr2>val6</attr2>
        <attr3>val7</attr3>
    </item>
    <item id="foo3">
        <attr1>val8</attr1>
        <attr2>val9</attr2>
        <attr3>val10</attr3>
        <interestingAttribute>val11</interestingAttribute>
    </item>
</items>

Я хотел бы получить этот результат

<items>
    <item id="foo1">
        <interestingAttribute>val4</interestingAttribute>
    </item>
    <item id="foo3">
        <interestingAttribute>val11</interestingAttribute>
    </item>
</items>

Можно ли это сделать с помощью XPath? Если нет, то какое преобразование XSLT мне следует использовать?

Ответы [ 2 ]

4 голосов
/ 21 июля 2009

XPath используется для выбора определенных узлов, и он не даст вам древовидную структуру, как вы хотите. Самое большее, вы можете получить из него список узлов, а из списка узлов вы можете получить древовидную структуру. Если все, что вам действительно нужно, это выбрать интересные атрибуты, вы можете попробовать этот XPath:

/items/item/interestingAttribute

Если вы хотите сгенерировать дерево, вам понадобится XSLT. Этот шаблон должен сделать это:

<xsl:template match="/items">
    <xsl:copy>
        <xsl:for-each select="item[interestingAttribute]">
            <xsl:copy>
                <xsl:copy-of select="@* | interestingAttribute"/>
            </xsl:copy>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>
2 голосов
/ 21 июля 2009

Это будет выбирать только <item> s, которые имеют <interestingAttribute> дочерние элементы:

/items/item[interestingAttribute]

Или вы можете выбрать <interestingAttribute> сами элементы, например, так:

/items/item/interestingAttribute

Эти два выражения вернут вам набор узлов, список узлов XML. Если вы действительно пытаетесь преобразовать один документ в другой, вы, вероятно, захотите использовать XSLT, но помните, что XPath является основным компонентом XSLT, поэтому вы наверняка будете использовать выражения XPath, подобные приведенным выше, для управления преобразованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...