2016-04-08 10 views
3

У меня есть XML-структуры, как это:Найти элемент с самой высокой валентности в 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 как Integer в переменную с именем 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> 
+1

Просто хочу указать, что [переменные XSL нельзя переназначить] (http://stackoverflow.com/questions/19255139/reassign-xsl-variable-value), поэтому этот подход не работает. – Scribblemacher

ответ

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> 

Если вам действительно нужно одну переменную, чтобы быть числом v Затем добавьте <xsl:variable name="worst_status_number" select="number($worst_status)"/>.

+0

Попробуйте адаптировать предлагаемый подход к вашему более сложному вводу. Если вы этого не сделаете, опубликуйте новый вопрос, показывая, что вы попробовали, и объясните, где он терпит неудачу. –

+0

Я только что понял во втором после комментирования. Вот почему я снова удалил комментарий. Просто изменил XPath-Expression;) – Daniel

Смежные вопросы