Как выполнить итерацию данных XML с использованием XSL без жесткого кодирования имен элементов? - PullRequest
1 голос
/ 29 сентября 2011

Мы преобразуем эти данные XML в формат с разделителями каналов, используя XSL ...

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<LIBRARY> 
   <BOOK> 
        <TITLE>Professional JINI</TITLE> 
        <AUTHOR>Sing Li</AUTHOR>
        <PUBLISHER>Wrox Publications</PUBLISHER>
   </BOOK> 
</LIBRARY>

.

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

    <xsl:output method="text" indent="no"/>

    <!-- New line character variable -->
    <xsl:variable name="newline">
        <xsl:text>&#10;</xsl:text>
    </xsl:variable>

    <xsl:template match="/">         
        <xsl:for-each select="LIBRARY/BOOK">
            <xsl:value-of select="TITLE"/>|<xsl:value-of select="AUTHOR"/>|<xsl:value-of select="PUBLISHER"/>   
            <xsl:value-of select="$newline"/>       
        </xsl:for-each>

    </xsl:template>
</xsl:stylesheet>

Это вывод ...

Professional JINI|Sing Li|Wrox Publications

Есть ли способ получить значения TITLE, AUTHOR и т. Д. Без жесткого кодирования имен элементов в xsl: value-of? Мы хотим, чтобы этот XSL был универсальным, чтобы в случае добавления дополнительных атрибутов книги таблица стилей автоматически захватила эти новые поля.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2011

Вот полное решение XSLT 1.0, которое, вероятно, является одним из самых простых (без xsl:for-each, стиль push), кратчайшим :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="BOOK">
  <xsl:if test="not(position()=1)">
   <xsl:text>&#xA;</xsl:text>
  </xsl:if>
  <xsl:apply-templates select="*"/>
 </xsl:template>

 <xsl:template match="BOOK/*">
  <xsl:if test="not(position()=1)">|</xsl:if>
  <xsl:value-of select="."/>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к следующему документу XML :

<LIBRARY>
   <BOOK>
        <TITLE>Professional JINI</TITLE>
        <AUTHOR>Sing Li</AUTHOR>
        <PUBLISHER>Wrox Publications</PUBLISHER>
   </BOOK>
   <BOOK>
        <TITLE>XSLT 2.0 Programmer's Reference</TITLE>
        <AUTHOR>Michael Kay</AUTHOR>
        <PUBLISHER>Wrox Publications</PUBLISHER>
   </BOOK>
</LIBRARY>

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

Professional JINI|Sing Li|Wrox Publications
XSLT 2.0 Programmer's Reference|Michael Kay|Wrox Publications

II. Решение XSLT 2.0 :

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="BOOK">
  <xsl:if test="not(position()=1)">
   <xsl:text>&#xA;</xsl:text>
  </xsl:if>
  <xsl:value-of select="*" separator="|"/>
 </xsl:template>
</xsl:stylesheet>
0 голосов
/ 29 сентября 2011

Вы имеете в виду объединение всех подэлементов с |разделяя их?

<xsl:for-each select="node()>|<xsl:value-of select="."/></xsl:for-each>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...