我们正在尝试使用XSLT将带有占位符的HTML模板转换为最终的HTML。
(简化的)HTML模板看起来像:
<p>
<span class="condition" id="v6">Some text here
<span class="placeholder" id="v1" />
</span>
</p>
转换应该
- 将所有
span
元素替换为placeholder
类; - 隐藏或显示每个包含
condition
类的span
元素
(简化的)XSLT是:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:local="urn:local"
xmlns:s0="http://www.w3.org/1999/xhtml">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
<!-- Take the HTML template -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!--Replace every placeholder in the HTML template with the value from the XML data-->
<xsl:template match="span[@class='placeholder']">
<xsl:variable name="this" select="current()/@id"/>
<xsl:value-of select="'replaced'" />
</xsl:template>
<!-- Handle conditions based on custom logic -->
<xsl:template match="span[@class='condition']">
<xsl:variable name="this" select="current()/@id"/>
<xsl:if test="$this = 'v6'">
<xsl:value-of select="current()" />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
如果占位符span没有嵌套到条件span中,则一切正常。然而,在上面的HTML示例中,它不起作用,输出是:
<p>Some text here</p>
我们希望它是:
<p>
Some text here
replaced
</p>
似乎条件被执行了,但占位符没有被执行或以某种方式被覆盖;所以基本上,占位符span元素不会被替换。
有没有人对此有一个解释,我们做错了什么?
谢谢!
同时找到了一个解决方案:
<!-- Handle conditions based on custom logic -->
<xsl:template match="span[@class='condition']">
<xsl:variable name="this" select="current()/@id"/>
<xsl:if test="$this = 'v6'">
<xsl:apply-templates select="node()"/> <<<<----------------
</xsl:if>
</xsl:template>
不使用当前文本,而是重新应用节点