0

我面临相同级别和特定顺序的相同名称节点的问题。我的订单取决于他们节点的价值。我的输出应该是一个txt文件。我的 XML 看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<header>
  <B>
    <element>
      <value>10</value>
      <value>test</value>
    </element>
  </B>

  <A>
    <element>
      <value>100</value>
      <value>message</value>
    </element>
  </A>
  <B>
    <element>
      <value>20</value>
      <value>phase</value>
    </element>
  </B>

  <A>
    <element>
      <value>101</value>
      <value>type</value>
    </element>
  </A>
  <B>
    <element>
      <value>20</value>
      <value>phase</value>
    </element>
  </B>

  <A>
    <element>
      <value>101</value>
      <value>type</value>
    </element>
  </A>
</header>

我的 txt 输出应该是这样的。

typephase typephase

等等。

我的 XSL 看起来像这样

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="text" indent="yes" />
<xsl:template match="header/*">

        <xsl:if test="name(.) = 'A' and element/value='101'">
            <xsl:value-of select="element/value[position()=2]" />
        </xsl:if>
        <xsl:if test="name(.) = 'B' and element/value='20'">
            <xsl:value-of select="element/value[position()=2]" />
        </xsl:if>
        <xsl:text>&#xa;</xsl:text>      
</xsl:template>

<xsl:template match="/">
    <xsl:apply-templates select="header/*"></xsl:apply-templates>
</xsl:template>

这个 XSL 的结果是:

相型相型

xsl:sort descending 对我没有帮助,因为原始输入 XML 有更多的节点。我需要来自 XSL 而不是来自输入 XML 文档的命令。有谁知道,如何解决这个问题?

4

1 回答 1

0

我假设输入 XML 始终具有BABA 顺序中的元素......并且您没有缺少元素。我还假设您只希望AB元素成对出现,前提是它们都具有正确的值。

这个 XSLT 样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <!-- Match the root element and apply-templates to all its child elements. -->
  <xsl:template match="header">
    <xsl:apply-templates/>
  </xsl:template>

  <!-- Find A elements with a value of 101, where the B element just before has a value of 20. -->
  <xsl:template match="A[element/value='101'][preceding-sibling::B[1][element/value='20']]">
    <xsl:value-of select="element/value[2]"/>
    <xsl:value-of select="preceding-sibling::B[1]/element/value[2]"/>
    <xsl:text> </xsl:text>
  </xsl:template>

  <!-- Don't do anything with other A elements. -->
  <xsl:template match="A"/>

  <!-- Don't do anything else with B elements. -->
  <xsl:template match="B"/>

</xsl:stylesheet>

当应用于以下 XML 时:

<?xml version="1.0" encoding="UTF-8"?>
<header>
  <B>
    <element>
      <value>10</value>
      <value>test1</value>
    </element>
  </B>
  <A>
    <element>
      <value>100</value>
      <value>message1</value>
    </element>
  </A>
  <B>
    <element>
      <value>20</value>
      <value>phase2</value>
    </element>
  </B>
  <A>
    <element>
      <value>101</value>
      <value>type2</value>
    </element>
  </A>
  <B>
    <element>
      <value>20</value>
      <value>phase3</value>
    </element>
  </B>
  <A>
    <element>
      <value>101</value>
      <value>type3</value>
    </element>
  </A>
</header>

产生这个输出:

type2phase2 type3phase3 

我已经在value您的示例中的元素中添加了数字,以便更清楚地输出什么。

于 2013-09-12T12:09:40.697 回答