2014-10-30 74 views
0

這是一個例子,我想知道它是否可能。插入一個值取決於其兄弟值的節點

我有一些xml,我想循環,並檢查值取決於我想插入一個值的值。

我怎麼本質希望它的工作是: 如果node1 = AA或AB NODE0 =真棒 和 如果node1 = BC或BD NODE0 =美麗

但是我只想NODE0顯示美麗或真棒在集合中的第一個節點0中。

這是輸入

<parent> 
    <sibling> 
     <node1>aa</node1> 
     <node2></node2> 
     <node3></node3> 
     <node4></node4> 
     <node5></node5> 
    </sibling> 
    <sibling> 
     <node1>ab</node1> 
     <node2></node2> 
     <node3></node3> 
     <node4></node4> 
     <node5></node5> 
    </sibling> 
    <sibling> 
     <node1>bb</node1> 
     <node2></node2> 
     <node3></node3> 
     <node4></node4> 
     <node5></node5> 
    </sibling> 
    <sibling> 
     <node1>bc</node1> 
     <node2></node2> 
     <node3></node3> 
     <node4></node4> 
     <node5></node5> 
    </sibling> 
    <sibling> 
     <node1>bd</node1> 
     <node2></node2> 
     <node3></node3> 
     <node4></node4> 
     <node5></node5> 
    </sibling> 
</parent> 

輸出

<parent> 
    <sibling> 
     <node0>awesome</node0> 
     <node1>aa</node1> 
     <node2></node2> 
     <node3></node3> 
     <node4></node4> 
     <node5></node5> 
    </sibling> 
    <sibling> 
     <node0></node0> 
     <node1>ab</node1> 
     <node2></node2> 
     <node3></node3> 
     <node4></node4> 
     <node5></node5> 
    </sibling> 
    <sibling> 
     <node0>beautiful</node0> 
     <node1>bb</node1> 
     <node2></node2> 
     <node3></node3> 
     <node4></node4> 
     <node5></node5> 
    </sibling> 
    <sibling> 
     <node0></node0> 
     <node1>bc</node1> 
     <node2></node2> 
     <node3></node3> 
     <node4></node4> 
     <node5></node5> 
    </sibling> 
    <sibling> 
     <node0></node0> 
     <node1>bd</node1> 
     <node2></node2> 
     <node3></node3> 
     <node4></node4> 
     <node5></node5> 
    </sibling> 
</parent> 
+0

你的前充足的不符合你的規則,我想。另外,你究竟是什麼意思的「第一次」/ – 2014-10-30 16:06:09

+0

對不起,我重新編輯。我的意思是,當有一組三個兄弟姐妹,例如在第一個BB裏有第二個BB,在第二個BB裏有BB。值爲beautiful的node0僅出現在第一個兄弟節點中。另外兩個節點有一個空白節點0 – nrd22 2014-10-30 16:26:10

+0

好的,但這仍然不明確,因爲它可能意味着每個連續組的第一個或第一個整體(這是我的解決方案下面的解決方案)。 – 2014-10-30 16:54:22

回答

1

我相信這會做你想要什麼:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="sibling[node1='aa' or node1='ab'][1]"> 
    <xsl:copy> 
     <node0>awesome</node0> 
     <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="sibling[node1='bb' or node1='bc'][1]"> 
    <xsl:copy> 
     <node0>beautiful</node0> 
     <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="sibling"> 
    <xsl:copy> 
     <node0/> 
     <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

用於在xsl:copy內插入相似元素的有用提示。 – 2014-10-30 16:31:53

+0

對不起,這個作品完美。你能否解釋每個部分的作用,以便我可以在未來效仿? – nrd22 2014-10-30 17:27:33

+0

第一個模板是[identity transform](http://en.wikipedia.org/wiki/Identity_transform#Using_XSLT)規則。另外三個是規則的例外,我認爲它們是不言自明的。 – 2014-10-30 17:40:04

相關問題