2017-05-04 51 views
0

我的要求是略微複雜one.I具有以下輸入XML:轉換XML值

<results> 
    <row> 
     <CASEID>C1</CASEID> 
     <CASEBA>MEDICAID</CASEBA> 
     <ISSUEID>I1</ISSUEID> 
     <ISSUEBA>MEDICAID</ISSUEBA> 
     <OBJECTID>1</OBJECTID> 
    </row> 
    <row> 
     <CASEID>C1</CASEID> 
     <CASEBA>MEDICAID</CASEBA> 
     <ISSUEID>I2</ISSUEID> 
     <ISSUEBA>MEDICAID</ISSUEBA> 
     <OBJECTID>2</OBJECTID> 
    </row> 
    <row> 
     <CASEID>C1</CASEID> 
     <CASEBA>MEDICAID</CASEBA> 
     <ISSUEID>I1</ISSUEID> 
     <ISSUEBA>MEDICAID</ISSUEBA> 
     <OBJECTID>extra</OBJECTID> 
    </row> 
    <row> 
     <CASEID>C2</CASEID> 
     <CASEBA>MEDICAID</CASEBA> 
     <ISSUEID>I3</ISSUEID> 
     <ISSUEBA>MEDICAID</ISSUEBA> 
     <OBJECTID>3</OBJECTID> 
    </row> 
</results> 

我有上述XML轉換到使用XSLT通過按照下面條件簡單之一:

1)第一個目標是將新的<CASE>標記下的所有<CASEID>的值與<CASEBA>節點一起移動。

例如:

<CASE> 
    <CASEID>C1</CASEID> 
    <CASEBA>MEDICAID</CASEBA> 
</CASE> 

2)列出了所有的<ISSUEID> & <ISSUEBA><CASEID>的是在不同的<row>平等的和最近創建<CASE>標籤內的新標籤<ISSUE>下移動它們。

例如:

<CASE> 
    <CASEID>C1</CASEID> 
    <CASEBA>MEDICAID</CASEBA> 
    <ISSUE> 
     <ISSUEID>I1</ISSUEID> 
     <ISSUEBA>MEDICAID</ISSUEBA> 
    </ISSUE> 
    <ISSUE> 
     <ISSUEID>I2</ISSUEID> 
     <ISSUEBA>MEDICAID</ISSUEBA> 
    </ISSUE> 
    </CASE> 

3)列出了所有的<OBJECTID>的,其<ISSUEID>的是在不同的<row>的平等和<ISSUE>標籤,這將是絕對下內新<SOURCE>標籤下將它們移動<CASE>。 例如:

<CASE> 
     <CASEID>C1</CASEID> 
     <CASEBA>MEDICAID</CASEBA> 
     <ISSUE> 
      <ISSUEID>I1</ISSUEID> 
      <ISSUEBA>MEDICAID</ISSUEBA> 
      <SOURCE> 
       <OBJECTID>1</OBJECTID> 
      </SOURCE> 
      <SOURCE> 
       <OBJECTID>extra</OBJECTID> 
      </SOURCE> 
     </ISSUE> 
     <ISSUE> 
      <ISSUEID>I2</ISSUEID> 
      <ISSUEBA>MEDICAID</ISSUEBA> 
      <SOURCE> 
       <OBJECTID>2</OBJECTID> 
      </SOURCE> 
     </ISSUE> 
     </CASE> 

最終輸出的XML應該如下:

<results> 
    <CASE> 
     <CASEID>C1</CASEID> 
     <CASEBA>MEDICAID</CASEBA> 
     <ISSUE> 
     <ISSUEID>I1</ISSUEID> 
     <ISSUEBA>MEDICAID</ISSUEBA> 
     <SOURCE> 
      <OBJECTID>1</OBJECTID> 
     </SOURCE> 
     <SOURCE> 
      <OBJECTID>extra</OBJECTID> 
     </SOURCE> 
     </ISSUE> 
     <ISSUE> 
     <ISSUEID>I2</ISSUEID> 
     <ISSUEBA>MEDICAID</ISSUEBA> 
     <SOURCE> 
      <OBJECTID>2</OBJECTID> 
     </SOURCE> 
     </ISSUE> 
    </CASE> 
    <CASE> 
     <CASEID>C2</CASEID> 
     <CASEBA>MEDICAID</CASEBA> 
     <ISSUE> 
     <ISSUEID>I3</ISSUEID> 
     <ISSUEBA>MEDICAID</ISSUEBA> 
     <SOURCE> 
      <OBJECTID>3</OBJECTID> 
     </SOURCE> 
     </ISSUE> 
    </CASE> 
</results> 

請原諒我,如果我不好好解釋一下我的要求。如果您需要任何其他信息,請問我。如果有人幫我解決問題真的很好。

+1

XSLT 1或2?這對於這將會產生多大的複雜性會產生很大的影響。 –

+0

@ G_H,感謝您的回覆。我需要XSLT 2.'' –

+1

這是一個標準的分組應用程序。您將在任何XSLT教科書或教程中找到將代碼分組的示例。 XSLT 2.0比XSLT 1.0更容易分組。 –

回答

1

使用XSLT 1時,您必須使用名爲「Muenchian分組」的技巧,事情會變得複雜一些。幸運的是,對於XSLT 2,您可以使用<xsl:for-each-group>元素和current-group()函數。下面的樣式表生成您所需要的準確輸出作爲給定的輸入:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="caseID" match="row" use="CASEID" /> 

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

    <xsl:template match="/results"> 
     <results> 
      <xsl:for-each-group select="row" group-by="CASEID"> 
       <xsl:call-template name="handleCase" /> 
      </xsl:for-each-group> 
     </results> 
    </xsl:template> 

    <xsl:template name="handleCase"> 
     <CASE> 
      <xsl:copy-of select="CASEID" /> 
      <xsl:copy-of select="CASEBA" /> 
      <xsl:for-each-group select="current-group()" group-by="ISSUEID"> 
       <xsl:call-template name="handleIssue" /> 
      </xsl:for-each-group> 
     </CASE> 
    </xsl:template> 

    <xsl:template name="handleIssue"> 
     <ISSUE> 
      <xsl:copy-of select="ISSUEID" /> 
      <xsl:copy-of select="ISSUEBA" /> 
      <xsl:apply-templates select="current-group()/OBJECTID" /> 
     </ISSUE> 
    </xsl:template> 

    <xsl:template match="OBJECTID"> 
     <SOURCE> 
      <xsl:copy-of select="." /> 
     </SOURCE> 
    </xsl:template> 

</xsl:transform> 

,你可以窩整個事情,但要保持它的可讀性,我把它分成幾個命名模板。幸運的是,在調用另一個模板時,當前的組上下文被保留,因此您可以在該組內進一步分組。

+0

哇!超!!感謝我的複雜需求解決方案。另外一個用於快速響應。 –

+0

我正在使用JDK執行XSLT。不幸的是,它不能識別「for-each-group」。我應該只使用XSLT1.0來完成我的任務。你能幫我解決一下如何使用XSLT 1.0來準備相同的東西嗎?我在這裏打開了一個新線程..http://stackoverflow.com/questions/43818999/complex-grouping-based-on-node-values-using-xslt-1-0 –