Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于将XML解析为管道分隔值的通用XSLT_Xml_Xslt - Fatal编程技术网

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

用于将XML解析为管道分隔值的通用XSLT,xml,xslt,Xml,Xslt,我有下面的XML,需要将其转换为管道分隔值。约束条件是解决方案必须是通用的 <Root> <Element> <Value1>1</Value1> <Value2>2</Value2> <Value3/> <Value4/> </Element> <Element> <Value1>1</Value1>

我有下面的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>

到目前为止,这个链接对我很有用,但即使调整了它,我也无法动态地获得标记名。有什么办法可以让我通过这个考试吗?

经过太多的努力,我找到了自己的解决办法


|

;

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

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


您可以将
*
用作通配符。如果您需要更具体的建议,请发布您的尝试。在给定的链接中有与标记名关联的特定函数。我将硬编码值替换为*。它正在打印标记值,但不是以单个管道分隔的值。请显示您的代码,以便我们重现您的问题。我不知道“与标记名关联的特定函数”是什么意思。你能在这里检查一下XSLT 1.0解决方案(答案2)吗?如果你想处理所有子元素,那么,正如对你的问题的第一条评论中所指出的,你可以使用
*
而不是
Value
.Perfect。比我下面的答案好。完全通用的。谢谢你确定你有
?在您的问题中,有一个
Root
元素未在XSLT中说明。我是XSLT新手。我上面的代码以某种方式工作,但需要指定第一个子节点。您的代码是完全通用的,非常适合我使用。我现在正在使用您的xslt。
<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>