我有一个很大的.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
但我需要介绍我在问题中提出的案例。
答案 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)
我建议将条件划分为两个嵌套条件
请注意,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>