所以我一直有严重的问题让这个工作(我确信它很简单,我对XSL没什么经验)。
我试图在xml文档中迭代一堆非常不同的子元素,结构如下:
<transaction>
<data_xml>
<document data_type="0">
<element1>value1</element1>
<element2>value2</element2>
<element3>value3</element3>
</document>
</data_xml>
</transaction>
我使用的是XSL 1.0版本,考虑到我正在使用的系统的限制,我很确定我不能使用2.0。
我想要的输出是:
<foo>
<bar:element1><!CDATA[[value]]></bar:element1>
<bar:element2><!CDATA[[value]]></bar:element2>
<bar:element3><!CDATA[[value]]></bar:element3>
</foo>
我目前使用的糟糕代码是:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<foo>
<xsl:for-each select="/transaction/data_xml/document[@data_type='0']/*">
<bar:<xsl:value-of select="name(name(/transaction/data_xml/document[@data_type='0']/*)"/>>
<![CDATA[<xsl:value-of select="/transaction/data_xml/document[@data_type='0']/*"/>]]>
</bar:<xsl:value-of select="name(/transaction/data_xml/document[@data_type='0']/*)"/>>
</xsl:for-each>
</foo>
</xsl:template>
</xsl:stylesheet>
但是,当我使用它时,它只是遍历同一个元素多次,而不是依次遍历每个元素。
有什么想法吗?除了拍我的terribad看代码?
答案 0 :(得分:1)
你可能想做类似的事情:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:bar="http://example.com/bar">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<foo>
<xsl:for-each select="transaction/data_xml/document[@data_type='0']/*">
<xsl:element name="bar:{local-name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</foo>
</xsl:template>
</xsl:stylesheet>
,应用于您的示例输入,将导致:
<?xml version="1.0" encoding="utf-8"?>
<foo xmlns:bar="http://example.com/bar">
<bar:element1>value1</bar:element1>
<bar:element2>value2</bar:element2>
<bar:element3>value3</bar:element3>
</foo>
如果您希望各种bar:elementX
值为CDATA部分,则应在<xsl:output>
指令中指定,以便:
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" cdata-section-elements="bar:element1 bar:element2 bar:element3"/>
但是,这需要您事先知道所有可能的元素名称。否则你必须破解它,例如:
<xsl:template match="/">
<foo>
<xsl:for-each select="transaction/data_xml/document[@data_type='0']/*">
<xsl:element name="bar:{local-name()}">
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:value-of select="."/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:element>
</xsl:for-each>
</foo>
</xsl:template>
答案 1 :(得分:0)
两件事:
name()
或local-name()
来获取当前元素的名称。xsl:element
创建具有动态名称的元素。你不应该手动建立他们的标签:<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:bar="namespaceForBarGoesHere"
version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<foo>
<xsl:for-each select="/transaction/data_xml/document[@data_type='0']/*">
<xsl:element name="bar:{local-name()}">
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:value-of select="." />
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:element>
</xsl:for-each>
</foo>
</xsl:template>
产生这个结果:
<foo xmlns:bar="namespaceForBarGoesHere">
<bar:element1><![CDATA[value1]]></bar:element1>
<bar:element2><![CDATA[value2]]></bar:element2>
<bar:element3><![CDATA[value3]]></bar:element3>
</foo>