如何在XML或XSLT中获取sibiling-nodes?

时间:2017-03-07 09:57:58

标签: xml xslt xpath

我有一个很大的.xml文件。如您所见,我将其中的一部分上传为图片。作为一个例子,我标记了我需要使用Xpath或XSLT检测的部分内容。 Xpath或XSLT代码必须遍历整个.xml文件并找到任何情况(IsNewNode =" True")和(Removed =" True")属于同一个节点(例如,如图中所示,两者都属于)也都是sibilings,这意味着两者都具有相同的' Id'值(再次作为Id =" KANAL"中的一个例子)。 Please see the picture

我有' // * [@ IsNewNode =" True"和@Removed =" True"]' xpath。但它只适用于两者(IsNewNode =" True"和Removed =" True")位于一行中,如下所示:Please see the picture

但我需要介绍我在问题中提出的案例。

3 个答案:

答案 0 :(得分:0)

在节点'Items / PropertyEditor'上使用for-each 这里不是xslt专家。 所以不是最佳代码,我想

<xsl:variable name="RemovedTrueFound">
<xsl:for-each select="Items/PropertyEditor">
    <xsl:if test="(./@Id = 'KANAL') and (./@Removed='True')">
            <xsl:value-of select="found" />
    </xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="IsNewNodeTrueFound">
    <xsl:for-each select="Items/PropertyEditor">
        <xsl:if test="(./@Id = 'KANAL') and (./@IsNewNode='True')">
                <xsl:value-of select="found" />
        </xsl:if>
    </xsl:for-each>
</xsl:variable>
<xsl:if test="($RemovedTrueFound = 'found') and ($IsNewNodeTrueFound = 'found')>
    existence found
</xsl:if>

答案 1 :(得分:0)

请尝试以下XPath表达式:

//Items[PropertyEditor[@Id="KANAL" and @IsNewNode="True"] and  PropertyEditor[@Id="KANAL" and @Removed="True"]]

<强>更新

如果您需要XPath匹配Items,其中包含两个具有相同任何PropertyEditor属性的Id个子元素,你可以尝试

//Items[PropertyEditor[@IsNewNode="True"]/@Id=./PropertyEditor[@Removed="True"]/@Id]

这将检查Id的{​​{1}}是否与<PropertyEditor IsNewNode="True" Id>的{​​{1}}相同而未指定其实际值

答案 2 :(得分:0)

我建议将条件划分为两个嵌套条件

  1. 选择IsNewNode ='True'
  2. 的所有节点
  3. 表示步骤1中的节点。检查@Removed属性。
  4. 请注意,2种情况:节点具有@Removed属性或具有相同@Id的兄弟节点具有@Removed属性可以合并为一种:父节点具有@Id等于当前节点和@Removed属性的子节点。

    这是样式表:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*"/>
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
    <xsl:template match="//PropertyEditor[@IsNewNode='True']">
     <xsl:if test="../PropertyEditor[@Id = current()/@Id and @Removed='True']">
        <a><xsl:value-of select="@Id" /></a>
     </xsl:if>
    
    </xsl:template>
    </xsl:stylesheet>