xpath xsl находят, когда у родителя есть атрибут, равный значению - PullRequest
2 голосов
/ 01 сентября 2010

Это мой xml:

<root>
<node>
 <element id='1'>
   <subelement>val</subelement>
</element>
<element id='2'>
   <subelement>val</subelement>
</element>
</node>

Я не знаю имени родителя и имени узла

Потомок решения :: * [@ id = '1']/ подэлемент

Ответы [ 3 ]

1 голос
/ 01 сентября 2010

Если вы знаете, насколько это глубоко, вы можете просто использовать * как в:

/*/*/element[@id = '1']/subelement
1 голос
/ 01 сентября 2010

я не знаю имени родителя и имени узла

Решение descendant::*[ @id= '1' ]/subelement

Использование descendant::* может быть крайне неэффективным, поскольку это приводит к обходу полного поддерева, укорененного в текущем узле.

Вот эффективное решение XSLT :

Это преобразование:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>
 <xsl:key name="kElByParentId" match="*" use="../@id"/>

 <xsl:template match="/">
   <xsl:copy-of select="key('kElByParentId', '1')"/>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML (исправлено, чтобы быть правильно сформированным):

<root>
    <node>
        <element id='1'>
            <subelement>val</subelement>
        </element>
        <element id='2'>
            <subelement>val</subelement>
        </element>
    </node>
</root>

производит искомый, правильный результат :

<subelement>val</subelement>

Примечание : Использование клавиш (<xsl:key> и функция key()) делает это действительно эффективным решением - с сублинейным(даже близко к постоянному) сложность времени.

1 голос
/ 01 сентября 2010

Это соответствует условию в теме:

//element/@id eq //element/subelement/text()

Но что бы вы хотели с этим сделать?Возможно, вам нужно, чтобы это было более обобщенно?

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