作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个 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/
我是一名优秀的程序员,十分优秀!