2016-12-29 22 views
0

Есть ли способ скопировать 2 или 3 узла XML в переменную с помощью XSLT? Я ищу узлы, а не значения узлов.XSLT: скопировать несколько узлов только из xml в переменную

Мой образец XML является:

<node1> 
    <node2> 
    <node3>abc</node3> 
    <node4>def</node4> 
    </node2> 
</node1> 
<node1> 
    <node2> 
    <node3>123</node3> 
    <node4>456</node4> 
    </node2> 
</node1> 

И мой XSLT образец:

<xsl:for-each select="/node1/node2"> 
    <xsl:if test="current()/node4 ! = '456'"> 
    <xsl:copy-of select="./node3" /> 
    <xsl:copy-of select="./node4" /> 
    </xsl:if> 
</xsl:foreach> 

Проблема в том, что я получаю node4 каждый раз как первый узел XML вместо текущий. На node3 Я получаю текущий, и проблем нет.

+0

Мой вывод должен быть значением node3 и node4 как плоский файл, а дубликаты должны быть устранены. А также он должен работать очень быстро, так как входной сигнал очень большой, как 20 МБ. – rgu

ответ

0

Ваша проблема может быть вызвана RTF (Результирующее дерево Фрагмент) проблема XSLT-1.0:

переменная не может содержать набор узлов (но только RTF)

Я объяснил это проблема в this SO answer.

RTF не могут быть запрошены выражениями XPath-1.0, поэтому они полезны только в очень ограниченном подмножестве ситуаций.

Одно решение будет использовать the newer XSLT-2.0.

+0

Спасибо @ zx485. Есть ли способ обхода этой проблемы вместо использования xslt 2.0? – rgu

+0

@rgu: К сожалению, я ничего не знаю о :-(В противном случае я бы включил это в свой ответ. – zx485

+0

Вы можете преобразовать rtf в набор узлов, используя функцию набора узлов. См. Ссылку: http: // www.xml.com/pub/a/2003/07/16/nodeset.html – Bluewood66

0

Это может помочь вам просто выбрать узлы, которые вы хотите все сразу.

<xsl:variable name="sample"> 
    <xsl:copy-of select="/node1/node2[node4!='456']/*[name()='node3' or name()='node4']"/> 
</xsl:variable>