2016-04-28 40 views
0

我有具有以下結構的選擇性連接所有子節點的元素值

<Group> 
    <Note/> 
    <Type>Anaerobic</Type> 
    </Group> 
    <Group> 
    <Note>Note B</Note> 
    <Type>Type B</Type> 
    </Group> 
    <Group> 
    <Note>Note C</Note> 
    <Type>Type C</Type> 
    </Group> 
    <Group> 
    <Note>Note D</Note> 
    <Type>Type D</Type> 
    </Group> 

我需要的節點的內容選擇性地合併成一個單一元件如下的XML。

<Group_Note> Note B Type B , Note c Type C , Note D Type D</Group_Note> 

正如你可以看到<Type>與價值「厭氧」尚未與其他部分連接起來一起。我能夠使用下面的代碼將所有的值都變成單個字符串。

<xsl:template name="Group"> 
     <xsl:for-each select="$thisNode//node()"> 
     <xsl:value-of select="name()"/> 
     <xsl:if test="self::text()"> 
     <xsl:value-of select="."/> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

我該如何選擇性地挑選並選擇節點進行連接。任何幫助是極大的讚賞

+0

是「厭氧」你正在試圖修復一個bug遺漏,或者你正在試圖滿足要求,你不只是使用'字符串的原因( )'? –

回答

0

一種可能實現這一目標是使用下面的XSLT它迭代非空Note元素,並選擇他們所有的降text()節點:

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

    <xsl:template match="/root"> <!-- choose whatever root element you have --> 
    <Group_Note> 
     <xsl:for-each select="Group/*[../Note/text() != '']"> 
     <xsl:value-of select=".//text()"/> 
     <xsl:if test="position()!=last()"> <!-- no space after last element --> 
      <xsl:text> </xsl:text> 
     </xsl:if> 
     </xsl:for-each> 
    </Group_Note> 
    </xsl:template> 

</xsl:stylesheet> 

的輸出是:

<?xml version="1.0"?> 
<Group_Note>Note B Type B Note C Type C Note D Type D</Group_Note> 

如果插入

<xsl:value-of select="concat(Group[Note='']/Type,' ')" /> 

<xsl:for-each select="Group/*[../Note/text() != '']">之前,您將得到AnaerobicType屬性在開始 - 積累其他text()節點之前。

請注意,我通過檢查空的<Note />來區分Anaerobic節點與其他節點。如果你的要求不同,你將不得不調整謂詞。

最終的結果是:

<?xml version="1.0"?> 
<Group_Note>Anaerobic Note B Type B Note C Type C Note D Type D</Group_Note> 
+0

感謝您的解決方案。我如何修改它,以便連接時我與Anerobic首先滿足?例如,如果厭氧是最後? 注意事項】 注B 類型B 音符C C型 備註D 厭氧

0

嘗試是這樣的:

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

<xsl:template match="Group"/> 

<xsl:template match="Group[Note != '' and Type != '']"> 
    <xsl:if test="preceding-sibling::Group[Note != '' 
       and Type != '']">,</xsl:if> 
    <xsl:value-of select="concat(Note, ' ', Type)" /> 
</xsl:template> 
相關問題