对 xpath“以下”有点模糊;轴(如 xslt 中使用的)

发布于 2024-10-22 20:21:37 字数 313 浏览 0 评论 0原文

 <a>
   <x/>
   <m/>
   <y/>
   <m/>
 </a>

在匹配“a”的模板内,我想(首先)匹配“y”之前的任何“m”,然后 单独“y”后面的任何“m”。

<xsl:apply-templates select="./m[following::y]"/>

是我想到的,但我无法让它工作,而且,此外,我看不到如何阻止与“m”匹配的模板应用于正常流程以及特定位置我想插入m相关的内容。

 <a>
   <x/>
   <m/>
   <y/>
   <m/>
 </a>

Inside a template that matches 'a', I want to match (first) any 'm's before 'y', and then
separately any 'm's after 'y'.

<xsl:apply-templates select="./m[following::y]"/>

is what I thought of, but I can't get it to work, and, further, I can't see how to prevent the template that matches on 'm' from being applied in the normal flow as well as in the particular place i want to insert the m-related content.

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

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

发布评论

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

评论(1

落花随流水 2024-10-29 20:21:37

您的模板看起来不错,但您确定要使用以下吗?例如,此模板:

<xsl:template match="a">
    <a><xsl:apply-templates select="m[following::y]"/></a>
    <b><xsl:apply-templates select="m[following-sibling::y]"/></b>  
</xsl:template>

...应用于以下 XML:

<a>
   <x/>
   <m>match</m>
   <y/>
   <m>no match</m>
   <nested>
       <m>match 2</m>
       <y/>
   </nested>
</a>

...输出以下结果:

<a>matchno match</a>
<b>match</b>

第一个 apply-templates 匹配 不匹配< /code> 因为 following 包括按文档顺序位于上下文节点之后的所有节点,其中包括嵌套的

第二个模板仅匹配兄弟姐妹。

为了完整起见,我将添加以下模板,该模板仅匹配那些紧随其后的兄弟节点是 节点>:

<xsl:template match="a">
   <a><xsl:apply-templates select="m[following-sibling::*[1][self::y]]"/></a>
</xsl:template>

根据上述 XML,此模板输出以下内容:

<a>match</a>

Your template looks OK, but are you sure you want to use following? For example, this template:

<xsl:template match="a">
    <a><xsl:apply-templates select="m[following::y]"/></a>
    <b><xsl:apply-templates select="m[following-sibling::y]"/></b>  
</xsl:template>

...applied to the following XML:

<a>
   <x/>
   <m>match</m>
   <y/>
   <m>no match</m>
   <nested>
       <m>match 2</m>
       <y/>
   </nested>
</a>

...outputs the following result:

<a>matchno match</a>
<b>match</b>

The first apply-templates matches <m>no match</m> because following includes all nodes that are after the context node in document order, which includes the nested <y/>.

The second template matches only siblings.

For completeness, I'll add the following template, which matches only those <m> nodes whose immediate following sibling is a <y>:

<xsl:template match="a">
   <a><xsl:apply-templates select="m[following-sibling::*[1][self::y]]"/></a>
</xsl:template>

This template outputs the following, given the above XML:

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