xslt:如何用新标签包装不同的标签
xslt: How do I wrap different tags with new tags
我不确定这对 xslt 是否可行,但可以。
我需要将文章中的 xml 分成不同的部分。
我需要获取所有 xml 直到第一个 class name full-width 的 div 并将其包装在 div class 名称 narrow-wrap.
full-width div 需要用 div 和 class 名称包裹 wide-wrap .
然后一个新的 div with class narrow-wrap 开始并且所有 xml 直到下一个 div with class full-width 进入那个.等等。
这是 xml 的简化版本。标签可以有嵌套的内容,也可以有属性。
<p>lorem</p>
<div>ipsum</div>
<div class="full-width">
<img src="image.jpg" />
</div>
<p>lorem</p>
<p>ipsum</p>
<div class="full-width">
<img src="image.jpg" />
</div>
<div class="narrow-width">
<img src="image.jpg" />
</div>
<p>lorem</p>
<div class="full-width">
<img src="image.jpg" />
</div>
<div class="full-width">
<img src="image.jpg" />
</div>
<table>ipsum</table>
<p>lorem</p>
<p>ipsum</p>
<div class="narrow-width">
<img src="image.jpg" />
</div>
这就是我需要它在转换后的样子:
<div class="narrow-wrap">
<p>lorem</p>
<div>ipsum</div>
</div>
<div class="wide-wrap">
<div class="full-width">
<img src="image.jpg" />
</div>
</div>
<div class="narrow-wrap">
<p>lorem</p>
<p>ipsum</p>
</div>
<div class="wide-wrap">
<div class="full-width">
<img src="image.jpg" />
</div>
</div>
<div class="wide-wrap">
<div class="narrow-width">
<img src="image.jpg" />
</div>
</div>
<div class="narrow-wrap">
<p>lorem</p>
</div>
<div class="wide-wrap">
<div class="full-width">
<img src="image.jpg" />
</div>
</div>
<div class="wide-wrap">
<div class="full-width">
<img src="image.jpg" />
</div>
</div>
<div class="narrow-wrap">
<table>ipsum</table>
<p>lorem</p>
<p>ipsum</p>
<div class="narrow-width">
<img src="image.jpg" />
</div>
</div>
全角部分的 xsl 应该是这样的:
<xsl:template match="div[contains(concat(' ', @class, ' '), ' full-width ')]">
<div>
<xsl:attribute name="class">
wide-wrap
</xsl:attribute>
<xsl:copy-of select="."></xsl:copy-of>
</div>
</xsl:template>
用 class 窄包装将所有其他内容包装在 div 块中的部分超出了我的范围。
这可能吗?如果可能,怎么做?
查看 https://www.w3.org/TR/xslt20/#grouping-examples 中的 group-adjacent
示例并尝试 <xsl:for-each-group select="*" group-adjacent="not (@class = 'full-width')">
,然后,如示例中检查密钥并分别包装组中的每个项目 current-group ()
.
使用这种方法你得到
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="body">
<xsl:copy>
<xsl:for-each-group select="*" group-adjacent="not (@class = 'full-width')">
<xsl:choose>
<xsl:when test="current-grouping-key()">
<div class="narrow-wrap">
<xsl:apply-templates select="current-group()"/>
</div>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="div[contains(concat(' ', @class, ' '), ' full-width ')]">
<div class="wide-wrap">
<xsl:copy-of select="."></xsl:copy-of>
</div>
</xsl:template>
</xsl:transform>
我不确定这对 xslt 是否可行,但可以。 我需要将文章中的 xml 分成不同的部分。
我需要获取所有 xml 直到第一个 class name full-width 的 div 并将其包装在 div class 名称 narrow-wrap.
full-width div 需要用 div 和 class 名称包裹 wide-wrap .
然后一个新的 div with class narrow-wrap 开始并且所有 xml 直到下一个 div with class full-width 进入那个.等等。
这是 xml 的简化版本。标签可以有嵌套的内容,也可以有属性。
<p>lorem</p>
<div>ipsum</div>
<div class="full-width">
<img src="image.jpg" />
</div>
<p>lorem</p>
<p>ipsum</p>
<div class="full-width">
<img src="image.jpg" />
</div>
<div class="narrow-width">
<img src="image.jpg" />
</div>
<p>lorem</p>
<div class="full-width">
<img src="image.jpg" />
</div>
<div class="full-width">
<img src="image.jpg" />
</div>
<table>ipsum</table>
<p>lorem</p>
<p>ipsum</p>
<div class="narrow-width">
<img src="image.jpg" />
</div>
这就是我需要它在转换后的样子:
<div class="narrow-wrap">
<p>lorem</p>
<div>ipsum</div>
</div>
<div class="wide-wrap">
<div class="full-width">
<img src="image.jpg" />
</div>
</div>
<div class="narrow-wrap">
<p>lorem</p>
<p>ipsum</p>
</div>
<div class="wide-wrap">
<div class="full-width">
<img src="image.jpg" />
</div>
</div>
<div class="wide-wrap">
<div class="narrow-width">
<img src="image.jpg" />
</div>
</div>
<div class="narrow-wrap">
<p>lorem</p>
</div>
<div class="wide-wrap">
<div class="full-width">
<img src="image.jpg" />
</div>
</div>
<div class="wide-wrap">
<div class="full-width">
<img src="image.jpg" />
</div>
</div>
<div class="narrow-wrap">
<table>ipsum</table>
<p>lorem</p>
<p>ipsum</p>
<div class="narrow-width">
<img src="image.jpg" />
</div>
</div>
全角部分的 xsl 应该是这样的:
<xsl:template match="div[contains(concat(' ', @class, ' '), ' full-width ')]">
<div>
<xsl:attribute name="class">
wide-wrap
</xsl:attribute>
<xsl:copy-of select="."></xsl:copy-of>
</div>
</xsl:template>
用 class 窄包装将所有其他内容包装在 div 块中的部分超出了我的范围。 这可能吗?如果可能,怎么做?
查看 https://www.w3.org/TR/xslt20/#grouping-examples 中的 group-adjacent
示例并尝试 <xsl:for-each-group select="*" group-adjacent="not (@class = 'full-width')">
,然后,如示例中检查密钥并分别包装组中的每个项目 current-group ()
.
使用这种方法你得到
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="body">
<xsl:copy>
<xsl:for-each-group select="*" group-adjacent="not (@class = 'full-width')">
<xsl:choose>
<xsl:when test="current-grouping-key()">
<div class="narrow-wrap">
<xsl:apply-templates select="current-group()"/>
</div>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="div[contains(concat(' ', @class, ' '), ' full-width ')]">
<div class="wide-wrap">
<xsl:copy-of select="."></xsl:copy-of>
</div>
</xsl:template>
</xsl:transform>