将模板应用于当前节点的后同级的前同级

发布于 2024-11-10 17:59:19 字数 536 浏览 0 评论 0原文

您好,我有以下输入

<Root>
    <A rename="yes"/>
    <B rename="no"/>
    <C rename="no"/>
    <D rename="yes"/>
    <E rename="no"/>
    <F all="yes"/>
</Root>

,目前我位于 ,我想在 @rename="yes" 元素上应用模板,该元素位于元素

我正在尝试做类似的事情:

<xsl:apply-templates select=
 "following-sibling::*[@all='yes']/preceding-sibling::node()[@rename='yes'" />

但我没有得到预期的输出。请建议。

Hi I have following Input

<Root>
    <A rename="yes"/>
    <B rename="no"/>
    <C rename="no"/>
    <D rename="yes"/>
    <E rename="no"/>
    <F all="yes"/>
</Root>

Currently i am at <A> and i want apply template on the element whose @rename="yes", that is coming before element <F>.

i am trying to doing something like:

<xsl:apply-templates select=
 "following-sibling::*[@all='yes']/preceding-sibling::node()[@rename='yes'" />

But i am not getting the expected output. Please suggest.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

兰花执着 2024-11-17 17:59:19

目前我在并且我想要
将模板应用于其元素
@rename="yes",即之前的内容
元素


您需要此 XPath 表达式(假设 A 只有一个名为 F 的同级元素):

following-sibling::F/preceding-sibling::*[@rename='yes'][1]

它选择 rename 属性值为 "yes" 的任何元素,并且该元素是名为 的任何后续同级(当前节点)元素的第一个此类前同级元素F。

这是一个完整的 XSLT 转换

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="A">
     <xsl:apply-templates mode="found" select=
     "following-sibling::F/preceding-sibling::*[@rename='yes'][1]"/>
 </xsl:template>

 <xsl:template match="*" mode="found">
  <xsl:copy-of select="."/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时

<Root>
    <A rename="yes"/>
    <B rename="no"/>
    <C rename="no"/>
    <D rename="yes"/>
    <E rename="no"/>
    <F all="yes"/>
</Root>

生成所需的正确结果

<D rename="yes"/>

Currently i am at <A> and i want
apply template on the element whose
@rename="yes", that is coming before
element <F>

You want this XPath expression (assuming A has only one following sibling named F):

following-sibling::F/preceding-sibling::*[@rename='yes'][1]

It selects any element whose rename attribute has value of "yes" and that is the first such preceding sibling of any following sibling (of the current node) element named F.

Here is a complete XSLT transformation:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="A">
     <xsl:apply-templates mode="found" select=
     "following-sibling::F/preceding-sibling::*[@rename='yes'][1]"/>
 </xsl:template>

 <xsl:template match="*" mode="found">
  <xsl:copy-of select="."/>
 </xsl:template>
</xsl:stylesheet>

when applied on the provided XML document:

<Root>
    <A rename="yes"/>
    <B rename="no"/>
    <C rename="no"/>
    <D rename="yes"/>
    <E rename="no"/>
    <F all="yes"/>
</Root>

the wanted, correct result is produced:

<D rename="yes"/>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文