使用 xslt 递归解析 xml
parsing though xml recursively using xslt
我有一个Xml如下:
<Soap:Envelope>
<Soap:Body>
<A>
<B>Text</B>
<C>Text</C>
<D>
<D1>Text</D1>
<D2>
<D3>Text</D3>
<D4>Text</D4>
</D2>
</D>
<E>
<E1>
<E2>
<E3>Text</E3>
</E2>
</E1>
</E>
</A>
</Soap:Body>
</Soap:Envelope>
如何使用 XSLT 递归解析所有标签(我只知道我将收到一个 xml 模板),知道标签名称和其中的 "Text"?我需要以 below.Below 格式存储数据,当我没有和标签时,答案工作正常。现在如何获取输出?
A_B = Text1
A_C = Text2
A_D_D1 = Text3
A_D_D2_D3 = Text4
A_D_D2_D4 = Text5
A_E_E1_E2_E3 = Text6
我知道我们需要写一个递归函数如下。这就是我需要帮助的地方。
<for-each select="./*">
//Recursive Function
</for-each>
提前致谢
以下样式表:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*[text()]">
<xsl:for-each select="ancestor-or-self::*">
<xsl:value-of select="name()" />
<xsl:if test="position()!=last()">
<xsl:text>_</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text> = </xsl:text>
<xsl:value-of select="." />
<xsl:text> </xsl:text>
<xsl:apply-templates select="*"/>
</xsl:template>
</xsl:stylesheet>
应用于您的示例输入,将 return:
A_B = Text
A_C = Text
A_D_D1 = Text
A_D_D2_D3 = Text
A_D_D2_D4 = Text
A_E_E1_E2_E3 = Text
已添加:
您的新要求定义不够好(并且您的新 XML 格式不正确)。如果我猜对了,您想从串联路径中排除任何命名空间元素名称。如果是这样,替换:
<xsl:for-each select="ancestor-or-self::*">
与:
<xsl:for-each select="ancestor-or-self::*[not(namespace-uri())]">
我有一个Xml如下:
<Soap:Envelope>
<Soap:Body>
<A>
<B>Text</B>
<C>Text</C>
<D>
<D1>Text</D1>
<D2>
<D3>Text</D3>
<D4>Text</D4>
</D2>
</D>
<E>
<E1>
<E2>
<E3>Text</E3>
</E2>
</E1>
</E>
</A>
</Soap:Body>
</Soap:Envelope>
如何使用 XSLT 递归解析所有标签(我只知道我将收到一个 xml 模板),知道标签名称和其中的 "Text"?我需要以 below.Below 格式存储数据,当我没有和标签时,答案工作正常。现在如何获取输出?
A_B = Text1
A_C = Text2
A_D_D1 = Text3
A_D_D2_D3 = Text4
A_D_D2_D4 = Text5
A_E_E1_E2_E3 = Text6
我知道我们需要写一个递归函数如下。这就是我需要帮助的地方。
<for-each select="./*">
//Recursive Function
</for-each>
提前致谢
以下样式表:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*[text()]">
<xsl:for-each select="ancestor-or-self::*">
<xsl:value-of select="name()" />
<xsl:if test="position()!=last()">
<xsl:text>_</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text> = </xsl:text>
<xsl:value-of select="." />
<xsl:text> </xsl:text>
<xsl:apply-templates select="*"/>
</xsl:template>
</xsl:stylesheet>
应用于您的示例输入,将 return:
A_B = Text
A_C = Text
A_D_D1 = Text
A_D_D2_D3 = Text
A_D_D2_D4 = Text
A_E_E1_E2_E3 = Text
已添加:
您的新要求定义不够好(并且您的新 XML 格式不正确)。如果我猜对了,您想从串联路径中排除任何命名空间元素名称。如果是这样,替换:
<xsl:for-each select="ancestor-or-self::*">
与:
<xsl:for-each select="ancestor-or-self::*[not(namespace-uri())]">