如何从 xslt 1.0 中的当前节点祖先访问前一个兄弟的 child
How to access the child of preceding sibling from current's node ancestor in xslt 1.0
我有一个关于使用 Xpath 轴从当前节点祖先的前一个兄弟节点获取节点值的问题。在下面的代码中,假设我目前在组 id="1" 的 "g_place id="3"" 中。我的目标是将组 id="0" 的所有节点 "g_place" 与节点 "g_place id="3".
进行比较
<conflict id="22">
<group id="0">
<g_priority>1</g_priority>
<g_transition id="9"/>
<g_place id="2">
<g_arc id="12"/>
</g_place>
<g_place id="3">
<g_arc id="13"/>
</g_place>
</group>
<group id="1">
<g_priority>2</g_priority>
<g_transition id="10"/>
<g_place id="3">
<g_arc id="14"/>
</g_place>
<g_place id="4">
<g_arc id="15"/>
</g_place>
</group>
<group id="2">
<g_priority>3</g_priority>
<g_transition id="11"/>
<g_place id="4">
<g_arc id="16"/>
</g_place>
<g_place id="5">
<g_arc id="17"/>
</g_place>
</group>
</conflict>
我已经尝试了一个解决方案,但它不起作用
<xsl:for-each select="key('conflict', $conflict_id)/group">
<xsl:sort select="g_priority" order="ascending" data-type="number" />
<xsl:choose>
<xsl:when test="position() = 1">
<xsl:text> If </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="./g_place">
<xsl:variable name="place_id" select="@id" />
<xsl:choose>
<xsl:when test="preceding-sibling::group[1]/g_place/attribute::id = $place_id">
<xsl:text> Elsif </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text> If </xsl:text>
</xsl:otherwise>
<xsl:choose>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
提前致谢。
删除 "sibling" 并在您的 XPath 中添加“/”:
//group[@id="1"]//g_place[@id="3"]/preceding::group[1]//g_place
returns 2 个节点。
当你使用
<xsl:for-each select="./g_place">
您现在处于 g_place
的上下文中。要访问前面的group
,您可以使用
<xsl:when test="../preceding-sibling::group[1]/g_place/attribute::id = $place_id">
../
意思是 parent::*
。或者,您可以使用 preceding
轴
<xsl:when test="preceding::group[1]/g_place/attribute::id = $place_id">
我有一个关于使用 Xpath 轴从当前节点祖先的前一个兄弟节点获取节点值的问题。在下面的代码中,假设我目前在组 id="1" 的 "g_place id="3"" 中。我的目标是将组 id="0" 的所有节点 "g_place" 与节点 "g_place id="3".
进行比较<conflict id="22">
<group id="0">
<g_priority>1</g_priority>
<g_transition id="9"/>
<g_place id="2">
<g_arc id="12"/>
</g_place>
<g_place id="3">
<g_arc id="13"/>
</g_place>
</group>
<group id="1">
<g_priority>2</g_priority>
<g_transition id="10"/>
<g_place id="3">
<g_arc id="14"/>
</g_place>
<g_place id="4">
<g_arc id="15"/>
</g_place>
</group>
<group id="2">
<g_priority>3</g_priority>
<g_transition id="11"/>
<g_place id="4">
<g_arc id="16"/>
</g_place>
<g_place id="5">
<g_arc id="17"/>
</g_place>
</group>
</conflict>
我已经尝试了一个解决方案,但它不起作用
<xsl:for-each select="key('conflict', $conflict_id)/group">
<xsl:sort select="g_priority" order="ascending" data-type="number" />
<xsl:choose>
<xsl:when test="position() = 1">
<xsl:text> If </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="./g_place">
<xsl:variable name="place_id" select="@id" />
<xsl:choose>
<xsl:when test="preceding-sibling::group[1]/g_place/attribute::id = $place_id">
<xsl:text> Elsif </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text> If </xsl:text>
</xsl:otherwise>
<xsl:choose>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
提前致谢。
删除 "sibling" 并在您的 XPath 中添加“/”:
//group[@id="1"]//g_place[@id="3"]/preceding::group[1]//g_place
returns 2 个节点。
当你使用
<xsl:for-each select="./g_place">
您现在处于 g_place
的上下文中。要访问前面的group
,您可以使用
<xsl:when test="../preceding-sibling::group[1]/g_place/attribute::id = $place_id">
../
意思是 parent::*
。或者,您可以使用 preceding
轴
<xsl:when test="preceding::group[1]/g_place/attribute::id = $place_id">