xsl выберите узел на основе числового значения - PullRequest
3 голосов
/ 08 июля 2011

У меня есть XML-документ, который я пытаюсь стилизовать с помощью xsl. Проблема в том, что мне нужно извлечь значение из определенного узла, но в xsl я не знаю, как различать два следующих узла:

XML:

<a number=1>
<car>1</car>
</a>

<a number=2>
<dog>1</dog>
</a>

<I_want_to_display>
<number>2</number>
</I_want_to_display>

XSL:

 <xsl:for-eachselect="I_want_to_display">
      <xsl:if test="number==2">
      ....display everything in <a number=2>
      </xsl:if>

Ответы [ 4 ]

1 голос
/ 09 июля 2011

Используйте этот однострочный XPath :

/*/*[@number = /*/I_want_to_display/number]

Полный код XSLT (9 строк) :

<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="/">
     <xsl:copy-of select="/*/*[@number = /*/I_want_to_display/number]"/>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к следующему документу XML (так как не был предоставлен правильно сформированный документ XML!):

<t>
    <a number="1">
        <car>1</car>
    </a>
    <a number="2">
        <dog>1</dog>
    </a>
    <I_want_to_display>
        <number>2</number>
    </I_want_to_display>
</t>

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

<a number="2">
   <dog>1</dog>
</a>

Объяснение : оператор XPath = при применении к двум наборам узлов равен true() для каждой пары узлов (один из первого набора узлов и второй из второго набора узлов) ), которые имеют одинаковое строковое значение.

1 голос
/ 09 июля 2011

Не зная точно, какой вывод вы ищете, но вот предположение.

Это правильно сформированный ввод XML:

<xml>
  <a number="1">
    <car>1</car>
  </a>

  <a number="2">
    <dog>1</dog>
  </a>

  <I_want_to_display>
    <number>2</number>
  </I_want_to_display>
</xml>

с этой таблицей стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:apply-templates select="node()|@*"/>
  </xsl:template>

  <xsl:template match="I_want_to_display">
    <xsl:variable name="vNbr" select="number/text()"/>
    <xsl:copy-of select="//*[normalize-space(@number) = $vNbr]"/>
  </xsl:template>

</xsl:stylesheet>

производит такой вывод:

<a number="2">
   <dog>1</dog>
</a>
0 голосов
/ 09 июля 2011

Вы можете собрать a узлы с ключом:

<xsl:key name="ka" match="a" use="@number"/>

и использовать ключ для их последующего использования в нужном шаблоне, например:

<xsl:for-each select="I_want_to_display">
  <xsl:copy-of select="key('ka',normalize-space(number))"/>
</xsl:for-each>
0 голосов
/ 08 июля 2011
<xsl:for-each select="I_want_to_display">
  <xsl:copy-of select="preceding-sibling::a[@number = current()/number]/node()>
</xsl:for-each>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...