2014-01-13 3 views
0

Я не понимаю, почему мой элементный контент не копируется?XSL: невозможно получить (скопировать) содержимое элемента?

т.е. мой XML текущий результат выглядит следующим образом

<root> 
    <foo>some content</foo> 
    <set> 
    <set-element> 
     <set-key>some-key</set-key> 
     <set-val/> 
    </set-element>  
    </set> 
</root> 

Так идея заключается в том, что я хочу, чтобы скопировать, Что в элементе в элементе. Ожидаемый результат должен быть

<root> 
    <foo>some content</foo> 
    <set> 
    <set-element> 
     <set-key>some-key</set-key> 
     <set-val>some content</set-val> 
    </set-element> 
    </set> 
</root> 

Мой шаблон XSL выглядит следующим образом

<axsl:template match="set"> 
    <axsl:copy> 
     <axsl:apply-templates select="@*|node()"/> 
     <set-element> 
      <set-key>some-key</set-key> 
      <set-val><axsl:value-of select="foo"/></set-val> 
     </set-element> 
    </axsl:copy> 
</axsl:template> 

Я пробовал много вещей вкл:

<value><axsl:value-of select="root/foo"/></value> 
<value><axsl:value-of select="root/foo/text()"/></value> 
<value><axsl:value-of select="foo/text()"/></value> 
<value><axsl:value-of select="foo/*"/></value> 

Как я пытался сохранить, Что ИНТ в обув элемент как параметр, а затем использовать этот параметр в значении: но все равно не удастся Может ли кто-нибудь увидеть проблему с моим шаблоном?

EDIT:

Что делать, если у меня есть несколько наборов-элементов в моем наборе, т.е.

<root> 
    <foo>some content</foo> 
    <set> 
    <set-element> 
     <set-key>some-key</set-key> 
     <set-val>some content</set-val> 
    </set-element> 
    <set-element> 
     <set-key>some-key-2</set-key> 
     <set-val>some content-2</set-val> 
    </set-element> 
    <set-element> 
     <set-key>some-key-3</set-key> 
     <set-val/> 
    </set-element> 
    </set> 
</root> 

И я хочу, чтобы добавить <foo> содержание к этому элементу 3 ?? Насколько я понимаю, для этого потребуется <xsl:template match=value>, чтобы иметь некоторый параметр, который укажет, какое значение изменить?

+0

Как вы решаете, когда установить 'set-val' в содержимое' foo', то есть какое именно условие? Мое решение отлично работает, если вы хотите сделать это для элементов _all_ 'set-val'. –

ответ

2

Проблема с вашим подходом контекст. Выражения XPath могут быть относительными, и их разрешение зависит от того, где именно вы находитесь в дереве XML.

Другими словами, если ваш шаблон соответствует set, затем следующую строку:

<axsl:value-of select="foo"/> 

извлекает дочерний узел из set которого элемент имя «Foo». (Но, конечно, этот дочерний узел не существует).

Чтобы найти узлы независимо от контекста, используйте выражение // в выражении. Но я бы рекомендовал вам не использовать его, если вы можете ссылаться на узлы из контекста, например. через оси, такие как preceding-sibling.

Stylesheet (отредактированный)

<?xml version="1.0" encoding="utf-8"?> 

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

<xsl:output method="xml" indent="yes"/> 

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

<xsl:template match="set-val[preceding-sibling::set-key='some-key-3']"> 
    <xsl:copy> 
    <xsl:value-of select="parent::set-element/parent::set/preceding-sibling::foo[1]"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Output (отредактированный)

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <foo>foo content</foo> 
    <set> 
    <set-element> 
     <set-key>some-key</set-key> 
     <set-val>some content</set-val> 
    </set-element> 
    <set-element> 
     <set-key>some-key-2</set-key> 
     <set-val>some content-2</set-val> 
    </set-element> 
    <set-element> 
     <set-key>some-key-3</set-key> 
     <set-val>foo content</set-val> 
    </set-element> 
    </set> 
</root> 

Обратите внимание, что я изменил свой вход. Текстовое содержимое foo теперь «foo content».

+0

Спасибо, Матиас, ваше решение отлично работает :) Я только что редактировал свой вопрос, так как мне любопытно, что, если у меня есть несколько элементов set-val, как я могу определить, какие изменения нужно изменить? –

+0

Смотрите мой комментарий выше. Вы хотите изменить все или некоторые из них? –

+0

только один из них .i.e. 3-й только в приведенном выше примере –

Смежные вопросы