Используя XSLT, добавьте атрибут элемента к другому атрибуту другого элемента. - PullRequest
2 голосов
/ 24 марта 2012

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

<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?

Ответы [ 2 ]

1 голос
/ 24 марта 2012

Следующая таблица стилей использует контекст совпавшего 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 голосов
/ 24 марта 2012

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

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...