xsl: value-of используется как xsl: имя элемента - PullRequest
7 голосов
/ 17 января 2011

У меня есть входящий XML-файл со структурой списка:

<list>
  <listItem>
    <name>elementOne</name>
    <value>elementOneValue</name>
  </listItem>
  <listItem>
    <name>elementTwo</name>
    <value>elementTwoValue</name>
  </listItem>
</list>

Который я пытаюсь преобразовать в эту структуру:

<elementOne>elementOneValue</elementOne>
<elementTwo>elementTwoValue</elementTwo>

Эту логику легко реализовать с помощью XSL, но у меня возникают сложности.

<xsl:for-each select="/list/listItem">
  <xsl:element name="<xsl:value-of select="name"/>">
    <xsl:value-of select="value"/>
  </xsl:element>
</xsl:for-each>

Не работает, потому что я предполагаю, что последовательные двойные кавычки разбивают тег <xsl:element>

<xsl:for-each select="/list/listItem">
  <<xsl:value-of select="name"/>>
    <xsl:value-of select="value"/>
  </<xsl:value-of select="name"/>>
</xsl:for-each>

Не работает, потому что я не могу использовать << или >> и

<xsl:for-each select="/list/listItem">
  &lt;<xsl:value-of select="name"/>&gt;
    <xsl:value-of select="value"/>
  &lt;/<xsl:value-of select="name"/>&gt;
</xsl:for-each>

Не работает, потому что я в конечном итоге> и <в моем коде вместо разбора XML <code>< или >. Я ожидал, что это будет очень простое решение, но я не могу найти никаких записей для этого в Интернете. Какое простое исправление я пропускаю?

Ответы [ 3 ]

13 голосов
/ 17 января 2011

Вот полное и краткое решение с использованием инструкции <xsl:element> XSLT :

<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="listItem">
   <xsl:element name="{name}">
     <xsl:value-of select="value"/>
   </xsl:element>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному документу XML (исправлено, чтобы быть правильно сформированным):

<list>
    <listItem>
        <name>elementOne</name>
        <value>elementOneValue</value>
    </listItem>
    <listItem>
        <name>elementTwo</name>
        <value>elementTwoValue</value>
    </listItem>
</list>

желаемый результат получен :

<elementOne>elementOneValue</elementOne>
<elementTwo>elementTwoValue</elementTwo>

Примечание :

  1. Использование инструкции <xsl:element> для создания элемента со статически неизвестным именем.

  2. Использование AVT ( Attribute-Value-Template ) для указания атрибута name в компактном и более удобочитаемом виде.

  3. Возможно возникновение ошибки , если строковые значения elementOne и elementTwo не подчиняются лексическим / синтаксическим правилам для имени элемента (QName).

7 голосов
/ 17 января 2011

Я полагаю, вы можете использовать фигурные скобки вместо <xsl:value-of>:

<xsl:element name="{name}">
    <xsl:value-of select="value"/>
</xsl:element>
0 голосов
/ 17 января 2011

Не пробовал, но это должно сработать ...

   <xsl:for-each select="/list/listItem">
      <xsl:variable name="elemName" select="name"/>
      <xsl:element name="$elemName">
        <xsl:value-of select="value"/>
      </xsl:element>
    </xsl:for-each>
...