2017-05-16 38 views
-1

我有以下XML并需要将其转换为管道分隔值。约束是解决方案需要是一个通用的解决方案。用于将XML解析为管道分隔值的通用XSLT

<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联系是有益的我,但即使调整之后我couldnot动态获取标签名。有什么办法可以通过这个吗?

+1

你可以使用'*'作为通配符。发布你的尝试,如果你想更具体的建议。 –

+0

在给出的链接中有一些与标签名称相关的功能。我用*替换了硬编码值。它正在打印标签值,但不是在单个管道分隔值中。 – Arun

+1

请显示您的代码,以便我们可以重现您的问题。我不知道什么“*与标签名称*相关的某些功能”的含义。 –

回答

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

完美。比我下面的回答好。完全通用的一个。谢谢 – Arun

0

经过太多的工作,我发现我自己的解决方案。

<?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="*"/> 
 
\t <xsl:template match="/"> 
 
\t \t <xsl:for-each select="Element"> 
 
\t \t \t <xsl:for-each select="*"> 
 
\t \t \t \t <xsl:value-of select="." /> <xsl:if test="position() != last()">|<xsl:text/></xsl:if> 
 
\t \t \t \t 
 
\t \t \t </xsl:for-each> 
 
\t \t \t <xsl:text>&#xA;</xsl:text> 
 
\t \t </xsl:for-each> 
 
\t </xsl:template> 
 
\t 
 
</xsl:stylesheet>

+0

你确定你有''?在你的问题中,你的XSLT中没有考虑'Root'元素。 –

+0

我是XSLT新手。我的代码以某种方式工作,但需要指定第一个子节点。你的代码是完全通用的,适合我的使用。我正在使用你的xslt。 – Arun