用于将XML解析为管道分隔值的通用XSLT

时间:2017-05-16 15:09:50

标签: xml xslt

我有以下XML,需要将其转换为管道分隔值。约束是解决方案需要是通用解决方案。

<Root>
<Element>
    <Value1>1</Value1>
    <Value2>2</Value2>
    <Value3/>
    <Value4/>  
</Element>
<Element>
    <Value1>1</Value1>
    <Value2>2</Value2>
    <Value3>3</Value3>
    <Value4>4</Value4>
</Element>
<Element>
    <Value1>1</Value1>
    <Value2/>
    <Value3>3</Value3>
    <Value4>4</Value4>
</Element>
</Root>

预期的输出是:

1|2||
1|2|3|4
1||3|4

到目前为止this链接对我很有用,但即使在调整之后我也无法动态获取标记名称。有什么方法可以通过这个吗?

2 个答案:

答案 0 :(得分:1)

如果要将根元素的所有子元素转换为包含所有分离的子元素值的行,则应执行以下操作:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:param name="lf" select="'&#10;'"/>
    <xsl:param name="delim" select="'|'"/>

    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/*/*">
        <xsl:apply-templates/>
        <xsl:value-of select="$lf"/>
    </xsl:template>

    <xsl:template match="/*/*/*">
        <xsl:if test="position() > 1">
            <xsl:value-of select="$delim"/>
        </xsl:if>
        <xsl:value-of select="."/>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

经过太多努力,我找到了自己的解决方案。

&#13;
&#13;
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
	<xsl:template match="/">
		<xsl:for-each select="Element">
			<xsl:for-each select="*">
				<xsl:value-of select="." /> <xsl:if test="position() != last()">|<xsl:text/></xsl:if>
				
			</xsl:for-each>
			 <xsl:text>&#xA;</xsl:text>
		</xsl:for-each>
	</xsl:template>
	
</xsl:stylesheet>
&#13;
&#13;
&#13;