2012-03-23 8 views
2

Я ищу сделать преобразование, в котором я беру атрибут одного элемента и добавляю его к значению атрибута другого. Вот пример того, что я хотел бы сделать»Использование атрибута элемента атрибута XSLT для другого атрибута другого элемента

<Stuff> 
       <subsystem value="ssname"> 
       <item value="A">This is my value</item> 
       <item value="B">This is my other value</item> 
       </subsystem> 
</Stuff> 

Я хочу сделать преобразование с использованием XSLT, чтобы сделать следующее:

<Stuff> 
       <subsystem value="ssname"> 
       <item value="ssname_A">This is my value</item> 
       <item value="ssname_B">This is my other value</item> 
       </subsystem> 
</Stuff> 

Как я могу сделать это с помощью XSLT 1.0

?

ответ

1

следующая таблица стилей использует контекст согласованного item/@value загвоздка значение subsystem/@value с помощью выражения:. ../../@value в качестве альтернативы можно использовать /Stuff/subsystem/@value вместо

.
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output indent="yes"/> 

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

    <!-- specialized template for value attribute that concatenates 
     the subsystem/@value with the current @value --> 
    <xsl:template match="item/@value"> 
     <xsl:attribute name="value"> 
      <xsl:value-of select="concat(../../@value, 
             '_', 
             .)"/> 
     </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 
0

Это преобразование:

<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="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="item"> 
    <item value="{../@value}_{@value}"> 
    <xsl:apply-templates select="node()"/> 
    </item> 
</xsl:template> 
</xsl:stylesheet> 

при нанесении на поставленном XML документа:

<Stuff> 
    <subsystem value="ssname"> 
     <item value="A">This is my value</item> 
     <item value="B">This is my other value</item> 
    </subsystem> 
</Stuff> 

производит разыскиваемого, правильный результат:

<Stuff> 
    <subsystem value="ssname"> 
     <item value="ssname_A">This is my value</item> 
     <item value="ssname_B">This is my other value</item> 
    </subsystem> 
</Stuff> 
Смежные вопросы