2010-04-22 54 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

相关问题