如何在没有硬编码元素名称的情况下使用XSL迭代XML数据?

时间:2011-09-29 17:16:54

标签: xml xslt transformation

我们正在使用XSL将此xml数据转换为管道分隔格式...

<?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 :(得分:0)

这是一个XSLT 1.0完整解决方案,可能是最简单的(没有xsl:for-each,推送风格)最短的

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

答案 1 :(得分:-1)

你的意思是所有子元素与|的连接分开他们?

<xsl:for-each select="node()>|<xsl:value-of select="."/></xsl:for-each>