gpt4 book ai didi

xslt - 如何遍历前面的 sibling 直到某个点

转载 作者:行者123 更新时间:2023-12-01 06:50:59 24 4
gpt4 key购买 nike

我有这个 XML:

<p>
<span>Foo</span>
<br/>
</p>

<p>
<span>Foo</span>
<br/>
<span>Foo</span>
<span>Foo</span>
<br/>
</p>

<p>
<span>Foo</span>
<span>Foo</span>
<br/>
<span>Foo</span>
<span>Foo</span>
<span>Foo</span>
<br/>
</p>

我希望能够选择 <br/>首先标记,然后循环遍历它们上方的跨度。这样做的原因是为了摆脱 <br/>标记并替换为 <p></p>标签如下:

<p>
<span>Foo</span>
</p>

<p>
<span>Foo</span>
</p>

<p>
<span>Foo</span>
<span>Foo</span>
</p>

<p>
<span>Foo</span>
<span>Foo</span>
</p>

<p>
<span>Foo</span>
<span>Foo</span>
<span>Foo</span>
</p>

这是我想出的那种 xslt:

<xsl:template match="br">
<p>
<xsl:for-each select="preceding-sibling::span">
<span>
<xsl:value-of select="." />
</span>
</xsl:for-each>
</p>
</xsl:template>

我知道这是错误的,因为它会拾取 P 标签内的所有跨度,而不仅仅是前一个 br 标签之前的跨度。任何建议都非常感谢非常感谢

最佳答案

实现此目的的一种方法是使用 来匹配给定br 标记之前的所有span

<xsl:key name="para" match="span" use="generate-id(following-sibling::br[1])" />

即按紧随其后的第一个 br 将所有 span 标签分组。

然后您可以在 br 元素上进行匹配,并使用此键获取它之前的所有关联 span 标签

<xsl:template match="br">
<p>
<xsl:apply-templates select="key('para', generate-id())" />
</p>

这是完整的 XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>

<xsl:key name="para" match="span" use="generate-id(following-sibling::br[1])" />

<xsl:template match="/">
<body>
<xsl:apply-templates select="body/p" />
</body>
</xsl:template>

<xsl:template match="p">
<xsl:apply-templates select="br" />
<xsl:if test="span[not(following-sibling::br)]">
<p>
<xsl:apply-templates select="span[not(following-sibling::br)]" />
</p>
</xsl:if>
</xsl:template>

<xsl:template match="br">
<p>
<xsl:apply-templates select="key('para', generate-id())" />
</p>
</xsl:template>

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

当应用于以下输入 XML 时(我假设您的示例包含在 body 标记中以使其成为有效的 XML

<body>
<p>
<span>Foo 1</span>
<br/>
</p>
<p>
<span>Foo 2</span>
<br/>
<span>Foo 3</span>
<span>Foo 4</span>
<br/>
</p>
<p>
<span>Foo 5</span>
<span>Foo 6</span>
<br/>
<span>Foo 7</span>
<span>Foo 8</span>
<span>Foo 9</span>
<br/>
<span>Foo 10</span>
</p>
</body>

输出如下:

<body>
<p>
<span>Foo 1</span>
</p>
<p>
<span>Foo 2</span>
</p>
<p>
<span>Foo 3</span>
<span>Foo 4</span>
</p>
<p>
<span>Foo 5</span>
<span>Foo 6</span>
</p>
<p>
<span>Foo 7</span>
<span>Foo 8</span>
<span>Foo 9</span>
</p>
<p>
<span>Foo 10</span>
</p>
</body>

请注意,例如,我添加了一个案例来处理段落中没有后续 br 标签的 span 标签。

关于xslt - 如何遍历前面的 sibling 直到某个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7440841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com