Извлечь имя тега, атрибут и его значение - PullRequest
2 голосов
/ 19 декабря 2011

Образец XML-файла показан ниже

<a>
<apple color="red"/>
<banana color="yellow"/>
<sugar taste="sweet"/>
<cat size="small"/>
</a>

Что я должен написать в XSLT, чтобы я мог получить пример вывода ниже?

<AAA>apple</AAA>
<BBB>color</BBB>
<CCC>red</CCC>
<AAA>banana</AAA>
<BBB>color</BBB>
<CCC>yellow</CCC>

Ниже приведен файл XSLT, который я написал, но я не знаю, как извлечь значение.

<xsl:template match="*/*">
<AAA>
  <xsl:value-of select="name()"/>
</AAA>
  <xsl:apply-templates select="@*"/>
</xsl:template>
<xsl:template match="@*">
<BBB>
  <xsl:value-of select="name()"/>
</BBB>
</xsl:template>

Ответы [ 3 ]

2 голосов
/ 19 декабря 2011

Ваш xml должен быть как

<catalog>
    <fruit>
        <name>apple </name>
        <color>red</color>
    </fruit>
    <fruit>
        <name>banana  </name>
        <color>yellow</color>
    </fruit>
</catalog>

XSLT как:

 <xsl:for-each select="catalog/fruit">
      <tr>
        <td><AAA><xsl:value-of select="title"/></AAA></td>
        <td><BBB>color</BBB></td>
        <td><CCC><xsl:value-of select="color"/></CCC></td>
      </tr>
      </xsl:for-each>
1 голос
/ 19 декабря 2011

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

<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="*/*[not(self::sugar or self::cat)]">
  <AAA><xsl:value-of select="name()"/></AAA>
  <BBB><xsl:value-of select="name(@*)"/></BBB>
  <CCC><xsl:value-of select="@*"/></CCC>
 </xsl:template>
</xsl:stylesheet>

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

<a>
    <apple color="red"/>
    <banana color="yellow"/>
    <sugar taste="sweet"/>
    <cat size="small"/>
</a>

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

<AAA>apple</AAA>
<BBB>color</BBB>
<CCC>red</CCC>
<AAA>banana</AAA>
<BBB>color</BBB>
<CCC>yellow</CCC>

Примечание : Предполагается, что каждый соответствующий элемент имеет только один атрибут, как в случае с предоставленным документом XML.

1 голос
/ 19 декабря 2011
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="apple">
    <AAA><xsl:value-of select="local-name()"/></AAA>
  </xsl:template><!-- and then more of that for banana etc -->

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

</xsl:stylesheet>

и т. Д. Для banana и т. Д. Если вы не знаете идиому шаблона копирования (или удостоверения), то поищите его; без этого твоя жизнь XSLT будет несчастной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...