2016-03-17 94 views
0

XML輸入:XSLT選擇最低值的ID匹配

<Root> 


<output> 
    <queries> 
     <query name="Test"> 
      <parameters> 
       <parameter>298674,298673,298675,298676</parameter> 
      </parameters> 
      <queryResults> 
       <record id="1"> 
        <column name="Order">272334</column> 
        <column name="Task">272093</column> 
        <column name="FirstAction">2709305</column>      
       </record> 
       <record id="2"> 
        <column name="Order">272334</column> 
        <column name="Task">272093</column> 
        <column name="FirstAction">2709301</column> 
       </record> 
       <record id="3"> 
        <column name="Order">272334</column> 
        <column name="Task">272093</column> 
        <column name="FirstAction">2709306</column> 
       </record> 
       <record id="4"> 
        <column name="Order">268997</column> 
        <column name="Task">268756</column> 
        <column name="FirstAction">2709307</column> 
       </record> 
       <record id="5"> 
        <column name="Order"/> 
        <column name="Task"/> 
        <column name="FirstAction">2709307</column> 
       </record> 
      </queryResults> 
     </query> 
    </queries> 
</output> 
</Root> 

所需的輸出:

<Tag1> 
<Tag2> 
    <parameters> 
     <order id="272334"/> 
     <order id="268997"/> 
     <task id="272093"> 
      <grt> 
       <action id="2709301"/> 
      </grt> 
     </task> 
     <task id="268756"> 
      <grt> 
       <action id="2709307"/> 
      </grt> 
     </task> 
    </parameters> 
</Tag2> 
</Tag1> 

我想每列名=「訂購」具有相同的ID展示在<grt>中標記了列名'FirstAction'的最低值。如果列名'訂單'不重複,則在<grt>中顯示標記當前<record>標記中'FirstAction'的值。 基本上,如果相同的訂單號碼重複自己採取最低的第一個行動號碼,如果不是,那麼只需要從第一個行動節點的值。 我似乎無法使其工作。

我的XSL當前顯示了所有不同的順序值,沒有重複,但不知道如何爲FirstAction節點做。

我的XSL:

<xsl:template match="/"> 
    <Tag1> 
     <Tag2> 
      <parameters> 
       <xsl:for-each select="//record/column[@name='Order'][not(.=preceding::*)]"> 
        <order> 
         <xsl:attribute name="id"><xsl:value-of select="."/></xsl:attribute> 
        </order> 
       </xsl:for-each> 
       <xsl:for-each select="//record/column[@name='Task'][not(.=preceding::*)]"> 
        <task> 
         <xsl:attribute name="id"><xsl:value-of select="."/></xsl:attribute> 
         <grt> 
          <action> 
           <xsl:attribute name="id"><xsl:value-of select="current()/@column[@name='FirstAction']"/></xsl:attribute> 
          </action> 
         </grt> 
        </task> 
       </xsl:for-each> 

      </parameters> 
     </Tag2> 
    </Tag1> 
</xsl:template> 
</xsl:stylesheet> 

非常感謝您!

+0

您可以使用XSLT 2.0嗎? –

+0

否:(只有1.0可悲 – user3529643

+0

爲什麼最後一條記錄,沒有訂單/任務值,從結果中排除? –

回答

2

首先,我建議你用Muenchian method來分組你的記錄 - 並且只做一次。

然後使用相同的密鑰來獲得記錄當前組中,由FirstAction值排序,並獲得在排序組的第一個記錄:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:key name="record-by-order" match="record" use="column[@name='Order']" /> 

<xsl:template match="/Root"> 
    <xsl:variable name="unique-orders" select="//record[count(. | key('record-by-order', column[@name='Order'])[1]) = 1]"/> 
    <Tag1> 
     <Tag2> 
      <parameters> 
       <xsl:for-each select="$unique-orders"> 
        <order id="{column[@name='Order']}"/> 
       </xsl:for-each> 
       <xsl:for-each select="$unique-orders"> 
        <task id="{column[@name='Task']}"> 
         <xsl:for-each select="key('record-by-order', column[@name='Order'])"> 
          <xsl:sort select="column[@name='FirstAction']" data-type="number" order="ascending"/> 
          <xsl:if test="position()=1"> 
           <grt> 
            <action id="{column[@name='FirstAction']}"/> 
           </grt> 
          </xsl:if> 
         </xsl:for-each> 
        </task> 
       </xsl:for-each> 
      </parameters> 
     </Tag2> 
    </Tag1> 
</xsl:template> 

</xsl:stylesheet> 

適用於您的輸入,其結果將是:

<?xml version="1.0" encoding="UTF-8"?> 
<Tag1> 
    <Tag2> 
     <parameters> 
     <order id="272334"/> 
     <order id="268997"/> 
     <order id=""/> 
     <task id="272093"> 
      <grt> 
       <action id="2709301"/> 
      </grt> 
     </task> 
     <task id="268756"> 
      <grt> 
       <action id="2709307"/> 
      </grt> 
     </task> 
     <task id=""> 
      <grt> 
       <action id="2709307"/> 
      </grt> 
     </task> 
     </parameters> 
    </Tag2> 
</Tag1> 

注意

要排除沒有Order值的記錄,請嘗試:

<xsl:variable name="unique-orders" select="//record[string(column[@name='Order'])][count(. | key('record-by-order', column[@name='Order'])[1]) = 1]"/> 
+0

你,先生,是救命的人!非常感謝你,我會學習這個例子和邏輯,所以我將來會知道。 – user3529643