2012-12-17 79 views
0

我不是XSLT專家,請在這裏尋求幫助。XSLT連接元素

這裏是我的XML輸入:

<?xml version="1.0" encoding="UTF-8"?> 
<Target_Root> 
<RecordHeader> 
    <FileHeader>1234567</FileHeader> 
</RecordHeader> 
<TransDetails> 
    <TransHeader> 
     <FileHeaderRec/> 
     <BatchHeaderRec/> 
     <OrderingPartyRec/> 
     <TransBody> 
      <TransactionRec/> 
      <DescRec> 
       <_0160> 
        <RecordCode>1</RecordCode> 
        <VariantCode>A</VariantCode> 
        <Description>Srii1 </Description> 
       </_0160> 
      </DescRec> 
      <DescRec> 
       <_0160> 
        <RecordCode>1</RecordCode> 
        <VariantCode>A</VariantCode> 
        <Description>Srii2</Description> 
       </_0160> 
      </DescRec> 
      <NameBenRec/> 
      <CityBenRec/> 
     </TransBody> 
        <TransBody> 
      <TransactionRec/> 
      <DescRec> 
       <_0160> 
        <RecordCode>1</RecordCode> 
        <VariantCode>A</VariantCode> 
        <Description>Srii3 </Description> 
       </_0160> 
      </DescRec> 
      <DescRec> 
       <_0160> 
        <RecordCode>1</RecordCode> 
        <VariantCode>A</VariantCode> 
        <Description>Srii4</Description> 
       </_0160> 
      </DescRec> 
      <NameBenRec/> 
      <CityBenRec/> 
     </TransBody> 
    </TransHeader> 
    <BatchTrailerRec/> 
    <FileTrailerRec/> 
</TransDetails> 

和我預期的輸出結果是:

<?xml version="1.0" encoding="UTF-8"?> 
<Target_Root> 
<RecordHeader> 
    <FileHeader>1234567</FileHeader> 
</RecordHeader> 
<TransDetails> 
    <TransHeader> 
     <FileHeaderRec/> 
     <BatchHeaderRec/> 
     <OrderingPartyRec/> 
     <TransBody> 
      <TransactionRec/> 
      <DescRec> 
       <_0160> 
        <RecordCode>1</RecordCode> 
        <VariantCode>A</VariantCode> 
        <Description>Srii1 Srii2</Description> 
       </_0160> 
      </DescRec> 
      <NameBenRec/> 
      <CityBenRec/> 
     </TransBody> 
     <TransBody> 
      <TransactionRec/> 
      <DescRec> 
       <_0160> 
        <RecordCode>1</RecordCode> 
        <VariantCode>A</VariantCode> 
        <Description>Srii3 Srii4</Description> 
       </_0160> 
      </DescRec> 
      <NameBenRec/> 
      <CityBenRec/> 
     </TransBody> 
    </TransHeader> 
    <BatchTrailerRec/> 
    <FileTrailerRec/> 
</TransDetails> 

正如所看到的,我試圖來連接下的元素的值屬於一個上下文ID的段。雖然我可以使用我的內部應用程序來做到這一點,但它似乎非常耗時。有沒有人面對過這個要求?在此先感謝您的幫助。

回答

0

您可以建立在標識轉換之上。請參閱評論以獲得解釋。

建議爲XSLT 1.0

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

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

    <!-- Do nothing for DescRec elements that have a preceding sibling DescRec --> 
    <xsl:template match="DescRec[preceding-sibling::DescRec]"/> 

    <!-- For Description elements, concatenate the content of all the Description elements 
     within the same TransBody context --> 
    <xsl:template match="Description"> 
    <xsl:copy> 
     <xsl:for-each select="ancestor::TransBody//Description"> 
     <xsl:value-of select="."/> 
     </xsl:for-each> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

對於XSLT 2.0

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

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

    <!-- Do nothing for DescRec elements that have a preceding sibling DescRec --> 
    <xsl:template match="DescRec[preceding-sibling::DescRec]"/> 

    <!-- For Description elements, concatenate the content of all the Description elements 
     within the same TransBody context --> 
    <xsl:template match="Description"> 
    <xsl:copy> 
     <xsl:value-of select="ancestor::TransBody//Description" separator="''"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

輝煌的工作,非常感謝你,@Thomas W.這就像一個魅力。 :-D – Srii

+0

我很樂意學習XSLT。你能否建議我採取一種最好的方式去解決它?謝謝。 – Srii

+0

如果到目前爲止您只處理過程式和/或面向對象的語言,您應該投入一些時間來正確學習XSLT,因爲它需要一些時間才能習慣。經典的方式:請參閱XSLT入門書。我不記得我學習過哪一個 - 如果你有機會獲得一個帶有IT書籍的圖書館,看一下你看起來不錯。我認爲這本書提供練習至關重要。 –