2011-09-29 43 views
1

我们正在改变这种XML数据转换成使用XSL管道分隔格式...如何在不使用元素名称硬编码的情况下使用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 

有没有办法让标题,作者,etc..from的值,而不硬编码在XSL元素名称:value-of的?我们希望这个XSL是通用的,这样如果我们稍后添加更多书籍属性,样式表将自动捕获这些新的字段。

回答

-1

您的意思是所有子元素的连接,将它们分开?

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

我所要的输出是一样的,但我不想硬编码在XSL元素名:价值的,我想成为更通用的支持任意数量的书元素。 – raffian

+0

我试过了,正确的值被提取出来了,但是输出格式混乱了,它不在一行中;它实际上类似于源Xml;看起来白色空间正从源头拉进来;我怎样才能防止呢? – raffian

+0

我想出了, |,thx – raffian

0

这里是一个XSLT 1.0完整的解决方案,也可能是最简单的(没有xsl:for-each,推风格)最短的中:当这种转变是在下面的XML文档应用

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

<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> 
相关问题