2016-04-28 77 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> 
相关问题