2012-05-18 82 views
0

我想要匹配節點屬性值,如果相同的值出現在另一個節點屬性我必須合併他們兩個。因此,例如,我有一個xml重構節點

<xml> 
    <title> 
    <metadata> 
    <ref cite="ABC" relevance="2"/> 
    </metadata> 
    <body> 
     <para> 
      <text>(some text from title)</text> 
     </para> 
    </body> 
    </title> 
    <title> 
     <metadata> 
     <ref cite="ABC" relevance="1"/> 
     </metadata> 
    <body> 
     <para> 
      <text>(some more text from title 2)</text> 
     </para> 
    </body> 
    </title> 

    <mainbody> 
     <targetref cite="ABC"/> 
     <text>This is a text</text> 
    </mainbody> 
</xml> 

所以transformtion後的輸出應該是這樣的下方,所以根據引用元件標題/元數據/ REF的「ABC」和排序關聯(1,2 ... 。)如果引用元素「targetref」比賽cite元素的標題的內容得到匯成型主體的文本元素「裁判」

<xml> 
    <mainbody> 
    <targetref cite="ABC"/> 
    <text>This is a text 
     <para><text>(some more text from title 2)</text></para> 
     <para><text>(some text from title)</text></para> 
    </text> 
    </mainbody> 
</xml> 

感謝

回答

0

這裏一些XSLT,你想要做什麼:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

<xsl:output omit-xml-declaration="no" method="xml"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="mainbody"> 
<xsl:copy> 
     <xsl:copy-of select="targetref"/> 
     <xsl:element name="text"> 
      <xsl:value-of select="."/> 
      <xsl:variable name="key" select="targetref/@cite"/> 
      <xsl:for-each select="/xml/title[metadata/ref/@cite=$key]"> 
       <xsl:sort data-type="number" select="metadata/ref/@relevance" order="ascending" /> 
       <xsl:copy-of select="body/para"/> 
      </xsl:for-each> 
     </xsl:element> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="xml/title"/> 

<xsl:template match="xml"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*"> 
    <xsl:apply-templates/> 
</xsl:template> 

</xsl:stylesheet> 

訣竅是忽略正常流程上的節點xml/title,我們關注mainbody標記,之後我們調用for-each來選擇和排序所需的節點並將信息寫入我們想要的主體中。選擇需要一個變量($鍵)以過濾型主體爲apecified做到這一點

0

一種方式是通過一個關鍵的手段來查找基礎上,沿革資料參考值標題記錄:

<xsl:key name="ref" match="title" use="metadata/ref/@cite" /> 

然後,假設你被定位在型主體內的文本元素,你可以看看他們,像這樣,並在同一時間

<xsl:apply-templates select="key('ref', preceding-sibling::targetref/@cite)/body/para"> 
    <xsl:sort select="../../metadata/ref/@relevance" /> 

這裏對它們進行排序是完全XS LT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="ref" match="title" use="metadata/ref/@cite" /> 
    <xsl:template match="title" /> 

    <xsl:template match="mainbody/text"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     <xsl:apply-templates select="key('ref', preceding-sibling::targetref/@cite)/body/para" > 
     <xsl:sort select="../../metadata/ref/@relevance" /> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

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

當適用於您的示例XML,下面是輸出

<xml> 
    <mainbody> 
     <targetref cite="ABC"/> 
     <text>This is a text 
      <para> 
       <text>(some more text from title 2)</text> 
      </para> 
      <para> 
       <text>(some text from title)</text> 
      </para></text> 
    </mainbody> 
</xml>