3

次のような XML 構造があります。

<TR>
    <Zeile status="done">
        <Typ>FUNCTION</Typ>
        <Name>PressKey</Name>
    </Zeile>
    <Zeile status="failed">
        <Typ>FUNCTION</Typ>
        <Name>PressKey</Name>
    </Zeile>
    <Zeile status="warn">
        <Typ>FUNCTION</Typ>
        <Name>PressKey</Name>
    </Zeile>
    <Zeile status="done">
        <Typ>FUNCTION</Typ>
        <Name>PressKey</Name>
    </Zeile>
</TR>

今、最悪の要素を取得したいと思いますstatus

status最良から最悪への値の順序:

done
ignoreFailed
ignoreExpected
passed
unknown
warn
failed

どうすればこれにアプローチできますか? 最後に、status呼び出された変数の整数として、変数worst_statusの文字列として最悪の事態が必要ですworst_status_string


これは私が試したものです(ただし、変数の上書きが禁止されているため失敗しました):

<xsl:variable name="statusMapping">
    <statusMap>
        <status key="done" value="1"/>
        <status key="ignoreFailed" value="2"/>
        <status key="ignoreExpected" value="3"/>
        <status key="passed" value="4"/>
        <status key="unknown" value="5"/>
        <status key="warn" value="6"/>
        <status key="failed" value="7"/>
    </statusMap>
</xsl:variable>




<xsl:template match="//TR">
    <xsl:variable name="worst_status" select="1"/>

    <xsl:for-each select="Zeile">
        <xsl:variable name="current_status" select="@status"/>
        <xsl:for-each select="exslt:node-set($statusMapping)/statusMap/status">
            <xsl:if test="@key = $current_status">
                <xsl:if test="@value > $worst_status">
                    <xsl:variable name="worst_status" select="@value"/>
                </xsl:if>
            </xsl:if>
        </xsl:for-each>

        WorstStatus: <xsl:value-of select="$worst_status"/>
    </xsl:for-each>
</xsl:template>
4

1 に答える 1

2

最初のものを降順にソートして取得します。

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
  xmlns:exsl="http://exslt.org/common"
  exclude-result-prefixes="exsl">

<xsl:variable name="statusMapping-rtf">
        <status key="done" value="1"/>
        <status key="ignoreFailed" value="2"/>
        <status key="ignoreExpected" value="3"/>
        <status key="passed" value="4"/>
        <status key="unknown" value="5"/>
        <status key="warn" value="6"/>
        <status key="failed" value="7"/>
</xsl:variable>

<xsl:variable name="statusMapping" select="exsl:node-set($statusMapping-rtf)"/>




<xsl:template match="TR">
    <xsl:variable name="worst_status">
      <xsl:for-each select="Zeile">
          <xsl:sort select="$statusMapping/status[@key = current()/@status]/@value" data-type="number" order="descending"/>
          <xsl:if test="position() = 1">
              <xsl:value-of select="$statusMapping/status[@key = current()/@status]/@value"/>
          </xsl:if>
      </xsl:for-each>
    </xsl:variable>

    <xsl:variable name="worst_status_string" select="$statusMapping/status[@value = $worst_status]/@key"/>

    <xsl:value-of select="concat($worst_status_string, ': ', $worst_status)"/>
</xsl:template>

</xsl:transform>

1 つの変数を数値にする必要がある場合は、 を追加し<xsl:variable name="worst_status_number" select="number($worst_status)"/>ます。

于 2016-04-08T12:10:52.443 に答える