1

我想使用 XSLT 解析 XML 文件并将其转换为 CSV 格式。XML 格式如下所示:

            <a:level1>
              <a:level2>
                <b:level3">
                  <b:date a:value="TODAY">
                    <c:level4>
                      <d:level5>
                        <d:level6 a:value="AAA">
                          <d:level7 a:value="AAA_AAA">
                            <d:level8 a:value="XXX/123">
                              <d:leaf a:value="150415">
                                <b:leaf1>100</b:leaf1>
                                <b:leaf2>100</b:leaf2>
                              </d:leaf>
                              <d:leaf a:value="200814">
                                <b:leaf1>1961</b:leaf1>
                                <b:leaf2>1961</b:leaf2>
                              </d:leaf>
                            </d:level8>
                          </d:level7>
                        </d:level6>
                        <d:level6 a:value="BBB">
                          <d:level7 a:value="BBB_BBB">
                            <d:level8 a:value="XXX/123">
                              <d:leaf a:value="1505">
                                <b:leaf1>0.42</b:leaf1>
                                <b:leaf2>0.42</b:leaf2>
                              </d:leaf>
                            </d:level8>
                          </d:level7>
                        </d:level6>
                      </d:level5>
                    </c:level4>
                  </b:date>
                </b:level3>
              </a:level2>
            </a:level1>

目标是仅提取具有值的节点并将节点名称用作标题。输出 CSV 文件将如下所示:

            date, level6, leve7, level8, leaf, leaf1, leaf2
            TODAY, AAA , AAA_AAA, XXX/123, 150415, 100,100
            TODAY, AAA , AAA_AAA, XXX/123, 200814, 1961,1961
            TODAY, BBB , BBB_BBB, XXX/123, 1505, 0.42,0.42

我是 XSLT 的新手,你有关于如何在 CSV 中构造标题和行的示例吗?节点 level6、level7、level8、leaf 的名称可能在不同的文件中发生变化。

4

1 回答 1

0

这种转变

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:a="some:a">
 <xsl:output method="text"/>

 <xsl:variable name="vFirstLeaf" select=
 "(//*[@a:value][not(descendant::*[@a:value])])[1]"/>

 <xsl:variable name="vAllLevels" select=
 "$vFirstLeaf/ancestor-or-self::*[@a:value]
 |
  $vFirstLeaf/*
 "/>

 <xsl:template match="/">
  <xsl:apply-templates select="$vAllLevels" mode="title"/>
  <xsl:text>&#xA;</xsl:text>
  <xsl:apply-templates mode="lastNormal" select=
  "//*[@a:value and not(descendant::*[@a:value])]"/>
 </xsl:template>

 <xsl:template match="*" mode="title">
  <xsl:if test="not(position()=1)">, </xsl:if>
  <xsl:value-of select="local-name()"/>
 </xsl:template>

 <xsl:template match="*" mode="lastNormal">
  <xsl:apply-templates mode="value"
    select="ancestor-or-self::*[@a:value]"/>
  <xsl:apply-templates select="*"/>
  <xsl:text>&#xA;</xsl:text>
 </xsl:template>

 <xsl:template match="*" mode="value">
  <xsl:if test="not(position()=1)">, </xsl:if>
  <xsl:value-of select="@a:value"/>
 </xsl:template>

 <xsl:template match="*">
  <xsl:text>, </xsl:text>
  <xsl:value-of select="."/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<a:level1 xmlns:a="some:a" xmlns:b="some:b"
          xmlns:c="some:c" xmlns:d="some:d">
    <a:level2>
        <b:level3>
            <b:date a:value="TODAY">
                <c:level4>
                    <d:level5>
                        <d:level6 a:value="AAA">
                            <d:level7 a:value="AAA_AAA">
                                <d:level8 a:value="XXX/123">
                                    <d:leaf a:value="150415">
                                        <b:leaf1>100</b:leaf1>
                                        <b:leaf2>100</b:leaf2>
                                    </d:leaf>
                                    <d:leaf a:value="200814">
                                        <b:leaf1>1961</b:leaf1>
                                        <b:leaf2>1961</b:leaf2>
                                    </d:leaf>
                                </d:level8>
                            </d:level7>
                        </d:level6>
                        <d:level6 a:value="BBB">
                            <d:level7 a:value="BBB_BBB">
                                <d:level8 a:value="XXX/123">
                                    <d:leaf a:value="1505">
                                        <b:leaf1>0.42</b:leaf1>
                                        <b:leaf2>0.42</b:leaf2>
                                    </d:leaf>
                                </d:level8>
                            </d:level7>
                        </d:level6>
                    </d:level5>
                </c:level4>
            </b:date>
        </b:level3>
    </a:level2>
</a:level1>

产生想要的正确结果

date, level6, level7, level8, leaf, leaf1, leaf2
TODAY, AAA, AAA_AAA, XXX/123, 150415, 100, 100
TODAY, AAA, AAA_AAA, XXX/123, 200814, 1961, 1961
TODAY, BBB, BBB_BBB, XXX/123, 1505, 0.42, 0.42
于 2013-04-01T04:14:06.247 回答