2017-06-29 91 views
0

移動匹配的行的其餘節點我有以下輸入XML:分組和使用XSLT 1.0

<?xml version="1.0" encoding="UTF-8"?> 
<response> 
    <case> 
     <CMEDIA>Phone</CMEDIA> 
    </case> 
    <results> 
     <row> 
     <IKEY>TestKey1</IKEY> 
     <OBJECTID>TestObject1</OBJECTID> 
     <OBJECTPHYFILEID>ObjPhyField1</OBJECTPHYFILEID> 
     </row> 
     <row> 
     <IKEY>TestKey1</IKEY> 
     <OBJECTID>TestObject2</OBJECTID> 
     <OBJECTPHYFILEID>ObjPhyField2</OBJECTPHYFILEID> 
     </row> 
     <row> 
     <IKEY>TestKey1</IKEY> 
     <OBJECTID>TestObject3</OBJECTID> 
     <OBJECTPHYFILEID>ObjPhyField3</OBJECTPHYFILEID> 
     </row> 
     <row> 
     <IKEY>TestKey4</IKEY> 
     <OBJECTID>TestObject4</OBJECTID> 
     <OBJECTPHYFILEID>ObjPhyField4</OBJECTPHYFILEID> 
     </row> 
    </results> 
</response> 

我的要求是將所有的匹配<IKEY>行&一個<row>下拖曳移動並移動<OBJECTID> & <OBJECTPHYFILEID>節點存在於匹配的<IKEY>行(即在同一行中)在該新節點<SourceInstance>下。最後,我的輸出XML應該如下:

<?xml version="1.0" encoding="UTF-8"?> 
<response> 
    <case> 
     <CMEDIA>Phone</CMEDIA> 
    </case> 
    <results> 
     <row> 
     <IKEY>TestKey1</IKEY> 
     <Sources> 
      <SourceInstance> 
       <OBJECTID>TestObject1</OBJECTID> 
       <OBJECTPHYFILEID>ObjPhyField1</OBJECTPHYFILEID> 
      </SourceInstance> 
      <SourceInstance> 
       <OBJECTID>TestObject2</OBJECTID> 
       <OBJECTPHYFILEID>ObjPhyField2</OBJECTPHYFILEID> 
      </SourceInstance> 
      <SourceInstance> 
       <OBJECTID>TestObject3</OBJECTID> 
       <OBJECTPHYFILEID>ObjPhyField3</OBJECTPHYFILEID> 
      </SourceInstance> 
     </Sources> 
     </row> 
     <row> 
     <IKEY>TestKey4</IKEY> 
     <Sources> 
      <SourceInstance> 
       <OBJECTID>TestObject4</OBJECTID> 
       <OBJECTPHYFILEID>ObjPhyField4</OBJECTPHYFILEID> 
      </SourceInstance> 
     </Sources> 
     </row> 
    </results> 
</response> 

我用下面的XSLT嘗試,但未能達到預期的xml:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:key name="ikey" match="row" use="string(IKEY)" /> 
    <xsl:template match="results"> 
     <xsl:copy> 
     <xsl:apply-templates select="row[generate-id() = generate-id(key('ikey', string(IKEY))[1])]" mode="ikey" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="row" mode="ikey"> 
     <xsl:choose> 
     <xsl:when test="IKEY"> 
      <row> 
       <IKEY> 
        <xsl:value-of select="//IKEY" /> 
       </IKEY> 
       <Sources> 
        <xsl:for-each select="OBJECTID"> 
        <SourceInstance> 
         <xsl:value-of select="//key('ikey', IKEY)/OBJECTID" /> 
        </SourceInstance> 
        </xsl:for-each> 
       </Sources> 
      </row> 
     </xsl:when> 
     </xsl:choose> 
    </xsl:template> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

我相信,我在這裏失去了一些東西。有人可以幫我嗎?

+0

哪裏' ObjPhyField3'數據從何而來? –

+0

@馬丁Honnen,我很抱歉沒有添加正確的輸入xml的問題。我現在添加了它。你現在可以看到' ObjPhyField3'。 –

回答

1

使用key()功能,你可以找到當前組中的所有內容,然後可以將它們作爲需要:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:key name="ikey" match="row" use="string(IKEY)" /> 

    <xsl:template match="results"> 
     <xsl:copy> 
      <xsl:apply-templates select="row[generate-id() = generate-id(key('ikey', string(IKEY))[1])]" mode="ikey" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="row" mode="ikey"> 
     <xsl:choose> 
      <xsl:when test="IKEY"> 
       <row> 
        <xsl:copy-of select="IKEY"/> 
        <Sources> 
         <xsl:apply-templates select="key('ikey', IKEY)"/> 
        </Sources> 
       </row> 
      </xsl:when> 
     </xsl:choose> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="row"> 
     <SourceInstance> 
      <xsl:apply-templates select="*[not(self::IKEY)]"/> 
     </SourceInstance> 
    </xsl:template> 

</xsl:stylesheet> 
+0

感謝您的回覆。如何通過指定類似''''等的節點來獲取數據?提出這個問題的原因是我只需要很少的節點。 –

+0

我懂了!類似下面,我應該嘗試:'的 \t \t ' –

+0

非常感謝您的支持。加一個給你。 –