【问题标题】:parsing though xml recursively using xslt使用 xslt 递归地解析 xml
【发布时间】:2016-08-19 11:32:49
【问题描述】:

我有一个如下的 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>

如何递归解析所有标签(我只知道我将收到一个 xml 模板),使用 XSLT 知道标签名称和其中的“文本”?我需要以如下格式存储数据。当我没有和标签时,以下答案可以正常工作。现在如何获取输出?

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>

提前致谢

【问题讨论】:

  • 您的输入显示Text,而不是Text1Text2

标签: xml xslt recursion xml-parsing xslt-grouping


【解决方案1】:

以下样式表:

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>&#10;</xsl:text>
    <xsl:apply-templates select="*"/>
</xsl:template>

</xsl:stylesheet>

应用于您的示例输入,将返回:

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 的其他一些标签接收不同的有效负载。如何从输出中删除它们?
  • @Raghavendra 恐怕我不明白。编辑您的问题并显示输入示例(以及预期输出),或发布新问题。
  • 需要与更新后的 XML 相同的输出。当前的答案给出了额外的标签,因为我们正在使用祖先或自我::*。希望他说得通。
  • @Raghavendra 查看我的答案。
  • 谢谢,这正是我需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多