2010-04-22 84 views
3

我想獲得節點<m/>之後和節點</n>之前的所有文本節點的generate-id(.)。我正在尋找一些通用的XSL,而不是緊密耦合到下面提到的示例輸入模式。對於任何輸入模式,我想要獲取節點<m/><n/>之間的所有文本節點的ID。如何使用XSL選擇兩個元素之間的所有文本節點?

更好地理解採樣輸入:

<a> 
    <b> 
    <c> 
     This is first text node 
    </c> 
    </b> 
    <d> 
    <e> 
     This is my second text node 
    </e> 
    <f> 
     This is my <m/>third text node 
    </f> 
    <g> 
     One more text node 
    </g> 
    <h> 
    <i> 
     This is my fourth text node 
    </i> 
    </h> 
    <j> 
    This is my fifth <n/>text node 
    </j> 
    <k> 
    <l> 
     This is my sixth text node 
    </l> 
    </k>  
</d> 
</a> 

預期輸出: 生成具有值「第三文本節點」,「一個多文本節點」文本節點的ID,「這是我第四文本節點」 ,「這是我的第五」,它位於節點之間<m/><n/>

請給出你的想法。

+0

好問題(+1)。查看我的答案,獲得完整而緊湊的解決方案。 :) – 2010-04-22 22:26:40

回答

4

這種轉變

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="vtextPostM" select="//text()[preceding::m]"/> 
<xsl:variable name="vtextPreN" select="//text()[following::n]"/> 

<xsl:variable name="vtextBN-MandN" select= 
    "$vtextPostM[count(.|$vtextPreN) = count($vtextPreN)]"/> 

<xsl:variable name="vNL" select="'&#xA;'"/> 
<xsl:variable name="vQ">"</xsl:variable> 

<xsl:template match="/"> 
    <xsl:for-each select="$vtextBN-MandN"> 
    <xsl:value-of select= 
    "concat($vNL, 'Id: ', $vQ, generate-id(), $vQ, 
      'Text: ', $vQ, ., $vQ) 
    "/> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

時所提供的XML文檔應用時產生正確的,並希望得到

Id: "IDAOZDLB"Text: "third text node 
    " 
Id: "IDAQZDLBIDAQZDLB"Text: " 
     One more text node 
    " 
Id: "IDAUZDLBIDAUZDLB"Text: " 
     This is my fourth text node 
    " 
Id: "IDAYZDLB"Text: " 
    This is my fifth " 

請注意使用Kaysian方法節點集相交處:

$ns1[count(.|$ns2)=count($ns2)] 

選擇既屬於節點集$ns1也屬於節點集$ns2的所有節點。

+0

感謝它完美的作品。 – user323719 2010-04-23 13:46:25

相關問題