Xsl найти все узлы, которые затем называют как значение другого узла - PullRequest
2 голосов
/ 31 августа 2010

Как я могу найти с помощью Xsl все узлы, имена которых затем будут такими же, как и значения другого узла.

Ответы [ 3 ]

3 голосов
/ 31 августа 2010

Другой способ, это таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="kDataByName" match="*[ancestor::data1]" use="name()"/>
    <xsl:template match="/">
        <xsl:copy-of select="key('kDataByName',/root/nodesetFind/node1)"/>
    </xsl:template>
</xsl:stylesheet>

Выход:

<selectThese></selectThese>

Примечание : Это решение только для XSLT (ответ Димитра - общий XPath, затем XSLT), поскольку используется fn:key. Итак, вам нужно объявить ключ для использования этого выражения, чтобы выбрать нужные вам узлы:

key('kDataByName',/root/nodesetFind/node1)
3 голосов
/ 31 августа 2010

Использование :

/*/data1//*[name() = /*/nodesetFind/*]

Демонстрируется в XSLT-преобразовании :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:template match="/">
  <xsl:copy-of select="/*/data1//*[name() = /*/nodesetFind/*]"/>
 </xsl:template>
</xsl:stylesheet>

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

<root>
    <data1>
      <subdata1>
        ...
        <selectThese></selectThese>
        ...
      </subdata1>

    </data1>
    <nodesetFind>
      <node1>selectThese</node1>
    </nodesetFind>
  </root>

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

<selectThese></selectThese>
1 голос
/ 31 августа 2010
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <xsl:variable name="find" select="//nodesetFind/node1" />
        <root>
            <xsl:for-each select="//*[name()=$find]">
                <xsl:copy-of select="." />
            </xsl:for-each>
        </root>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...