2012-05-16 2 views
0

Я следующий исходный XMLXSLT - заменить узел с деревом

<forms> 
    <x> 
    <y> 
     <x-component select="foobar" /> 
    </y> 
    </x> 


    <component name="foobar"> 
    <some> 
     <component> 
      <value>text</value> 
     </component> 
    </some> 
    </component> 
</forms> 

Я пытаюсь преобразовать его в следующем:

<?xml version="1.0" encoding="UTF-8"?> 
<forms> 
    <x> 
     <y> 
      <component name="foobar"> 
       <some> 
        <component> 
         <value>text</value> 
        </component> 
       </some> 
      </component> 
     </y> 
    </x> 
</forms> 

Мой файл XSL является

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

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

    <xsl:template match="x-component"> 
     <yoba> 
      <xsl:attribute name="z"> 
       <xsl:value-of select="@select"/> 
      </xsl:attribute> 
      <xsl:apply-templates select="/forms/component[@[email protected]]/*" /> 
     </yoba> 
    </xsl:template> 

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

    <xsl:template match="/"> 
     <xsl:apply-templates select="*"/> 
    </xsl:template> 
</xsl:stylesheet> 

Как передать значение атрибута select текущего n ода для этой линии (вместо Местозаполнитель):

<xsl:apply-templates select="/forms/component[@name=<PLACEHOLDER>]/*" /> 
+0

Ваш XSLT выводит элемент ** yoba **, который не находится в вашем ожидаемом выходе. Это верно? –

+0

Это было для отладки, я получил вывод с yoba, но xsl: apply-templates внутри yoba не отображался – Kerb

ответ

2

Использование current()/@select. Или лучше определить ключ <xsl:key name="k1" match="component" use="@name"/> и сделать <xsl:apply-templates select="key('k1', @select)"/>.

+0

Спасибо, current()/@ select работал нормально – Kerb

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