我们正在使用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> </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是通用的,这样如果我们稍后添加更多书属性,样式表将自动捕获这些新字段。
答案 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>
</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>
</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>