Получение конкретных значений из xml с использованием xsl - PullRequest
0 голосов
/ 24 мая 2011

У меня есть xml, как показано ниже.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="artist"/></td>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet> 

Ответы [ 3 ]

1 голос
/ 24 мая 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="attributeName[.='salience']">
  <salience>
   <xsl:value-of select="../value"/>
  </salience>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

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

<attributes>
    <attribute>
        <attributeName>agenda-group</attributeName>
        <value>common</value>
    </attribute>
    <attribute>
        <attributeName>auto-focus</attributeName>
        <value>true</value>
    </attribute>
    <attribute>
        <attributeName>no-loop</attributeName>
        <value>true</value>
    </attribute>
    <attribute>
        <attributeName>salience</attributeName>
        <value>73</value>
    </attribute>
</attributes>

желаемый, правильный результат получается :

<salience>73</salience>
0 голосов
/ 24 мая 2011

Основная проблема заключается в следующем: xsl: if оператор

<xsl:if test="//attributes//attribute[(attributeName = 'salience')]">

На этом этапе контекст по-прежнему является корневым узлом, поэтому все, что он делает, это проверяет наличие *Элемент 1006 * attibute , вы фактически не позиционируете себя на узле.Таким образом, когда вы делаете xsl: value-of , вы просто получаете первое значение в XML.

Вместо использования xsl: if, вам, вероятно, следует попробовать сопоставить элемент attribute , например,

<xsl:apply-templates select="attributes/attribute[attributeName = 'salience']"/>

Весь XSLT будет выглядеть следующим образом

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/">
      <xsl:apply-templates select="attributes/attribute[attributeName = 'salience']"/>
   </xsl:template>
   <xsl:template match="attribute">
      <xsl:element name="{attributeName}">
         <xsl:value-of select="value"/>
      </xsl:element>
   </xsl:template>
</xsl:stylesheet>

При применении к вашемувходной XML, выходные данные выглядят следующим образом:

<salience>73</salience>

Обратите внимание на использование xsl: element

<xsl:element name="{attributeName}">

Это позволяет избежать жесткого кода salience в вашем подходящем шаблоне, что делает его более общим, если вы хотите сопоставить другие элементы аналогичным образом.

0 голосов
/ 24 мая 2011

Попробуйте:

  <xsl:template match="attributes/attribute">
    <xsl:if test=".//attributeName='salience'">
      <xsl:value-of select=".//value"/>
    </xsl:if>
  </xsl:template>

PS Пожалуйста, отформатируйте ваше сообщение, поскольку XSL не отображается.

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