Добрый день, уважаемые гуру.
Помогите, пожалуйста, решить следующую проблему в xslt 2.0 (saxon) .
Имеется примерно вот такой xml (было / стало)
<root>
<a id="a1"></a>
<a id="a2"></a>
<b id="b1" ref="a1">
<b_prop>some_val_1</b_prop>
</b>
<b id="b2" ref="a2">
<b_prop>some_val_2</b_prop>
</b>
</root>
<root>
<a id="a1" >
<a_prop>some_val_1</a_prop>
</a>
<a id="a2" >
<a_prop>some_val_2</a_prop>
</a>
<b id="b1" ref="a1"/>
<b id="b2" ref="a2"/>
</root>
Необходимо при помощи xslt перенести значения узлов
b_prop в узлы
a_prop "соответствующих" узлов
a
Соответствие узлов
a и
b находится по атрибутам
id и
ref
таким образом, что:
Псевдо-xslt-код:
0. current_b_prop_text = /root/b_prop/text()
1. current_b_prop_test_id = /root/b_prop/../@ref
2. target_a_node = /root/a[@id=$current_b_prop_test_id]
вот в этот
$target_a_node и надо добавить новый узел
a_prop и в него записать значение из
$current_b_prop_text
а сам узел
b_prop — "удалить"
<xsl:template match="b_prop">
<!-- вот тут непонятно, как записать в произвольный xml узел в output -->
</xsl:template>
Заранее благодарен за помощь!
Здравствуйте, nikinikiniki, Вы писали:
Ответ, наверно, уже не нужен, но пусть будет на форуме:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" indent="yes" />
<xsl:template match="root">
<root>
<xsl:apply-templates select="./a"/>
</root>
</xsl:template>
<xsl:template match="a">
<xsl:variable name="id" select="@id"/>
<a>
<xsl:attribute name="id">
<xsl:value-of select="@id"/>
</xsl:attribute>
<a_prop><xsl:value-of select="//b[@ref=current()/@id]/b_prop"/></a_prop>
</a>
</xsl:template>
</xsl:stylesheet>
Это даже не 2.0, для проверки использовался Xsltproc.exe.
"Больше 100кмч можно ехать на автобане в любом ряду кроме правого крайнего" (c) pik
"В германии земля в частной собственности" (c) pik
"Закрывать школы, при нулевой смертности среди детей и подростков, это верх глупости" (c) Abalak