Html 显示子节点
我目前有一个简单的标记,主要表示HTML 下面是其中的一个片段Html 显示子节点,html,xml,xslt,Html,Xml,Xslt,我目前有一个简单的标记,主要表示HTML 下面是其中的一个片段 <li>Make this <b>Bold</b></li> 请将此加粗 当然,我可以使用来确保标记被传递并自动显示为粗体,但是我有一个问题 我正在使用另一个XSL,它根据关键字或短语的存储库检查标记,如果它们存在,就会创建链接 下面是我的XSL <xsl:template name="List" match="li"> <li> &
<li>Make this <b>Bold</b></li>
请将此加粗
当然,我可以使用
来确保
标记被传递并自动显示为粗体,但是我有一个问题
我正在使用另一个XSL,它根据关键字或短语的存储库检查标记,如果它们存在,就会创建链接
下面是我的XSL
<xsl:template name="List" match="li">
<li>
<xsl:call-template name="markup">
<xsl:with-param name="text" select="."/>
<xsl:with-param name="phrases" select="document('../../documents/main/keywords.xml')/keywords/keyword"/>
<xsl:with-param name="first-only" select="false()"/>
</xsl:call-template>
</li>
</xsl:template>
这种方法可以防止任何子标签被传递,但是我不确定如何才能避免这种情况
非常感谢您的帮助!
Dan问题在于,您的链接创建模板做了错误的事情 正确的做法是使用标识模板并为
元素的文本节点后代创建专用模板
试试这个:
<xsl:variable
name="keywords"
select="document('../../documents/main/keywords.xml')/keywords/keyword"
/>
<!-- the identity template does copies of everything not matched otherwise -->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<!-- text nodes in <li> elements get special treatment -->
<xsl:template match="li//text()">
<xsl:call-template name="markup">
<xsl:with-param name="phrases" select="$keywords"/>
<xsl:with-param name="first-only" select="false()"/>
</xsl:call-template>
</xsl:template>
<!-- marks up the current node -->
<xsl:template name="markup">
<xsl:with-param name="phrases" />
<xsl:with-param name="first-only" select="true()" />
<!-- you can use . here - no need to pass in a $text param -->
</xsl:template>
身份模板是成功解决此类问题的关键。它可以透明地复制
和
这样的命名模板。这就是“推式”XSLT,也就是说,它是必需的,并且通常会导致非常笨拙的结果
将节点从流中拉出,并执行比复制节点更复杂的操作。这是“拉式”XSLT,即模板匹配。它通常更容易处理并生成更干净的XSLT代码
元素中的文本节点。只需更改匹配表达式即可影响其他节点
节点转换为
。使用“拉动”样式,这与以下内容一样简单:
<xsl:template match="b">
<strong>
<xsl:apply-templates select="node() | @*" />
<strong>
</xsl:template>
还请注意,执行
操作时,当前节点不会更改。因此,不需要将当前节点传递给被调用的模板。问题在于,您的链接创建模板做了错误的事情
正确的做法是使用标识模板并为
元素的文本节点后代创建专用模板
试试这个:
<xsl:variable
name="keywords"
select="document('../../documents/main/keywords.xml')/keywords/keyword"
/>
<!-- the identity template does copies of everything not matched otherwise -->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<!-- text nodes in <li> elements get special treatment -->
<xsl:template match="li//text()">
<xsl:call-template name="markup">
<xsl:with-param name="phrases" select="$keywords"/>
<xsl:with-param name="first-only" select="false()"/>
</xsl:call-template>
</xsl:template>
<!-- marks up the current node -->
<xsl:template name="markup">
<xsl:with-param name="phrases" />
<xsl:with-param name="first-only" select="true()" />
<!-- you can use . here - no need to pass in a $text param -->
</xsl:template>
身份模板是成功解决此类问题的关键。它可以透明地复制
和
这样的命名模板。这就是“推式”XSLT,也就是说,它是必需的,并且通常会导致非常笨拙的结果
将节点从流中拉出,并执行比复制节点更复杂的操作。这是“拉式”XSLT,即模板匹配。它通常更容易处理并生成更干净的XSLT代码
元素中的文本节点。只需更改匹配表达式即可影响其他节点
节点转换为
。使用“拉动”样式,这与以下内容一样简单:
<xsl:template match="b">
<strong>
<xsl:apply-templates select="node() | @*" />
<strong>
</xsl:template>
还请注意,执行
操作时,当前节点不会更改。因此,无需将当前节点传递给被调用的模板。能否提供有关模板标记功能的更多信息?目前,我看不出li元素的子元素丢失的任何原因。由于您将整个li元素传递给模板(
),因此模板中的所有子体都应该仍然可用。从本质上讲,markup.xsl查看关键字库(keywords.xml)并将其与正在查看的文档进行比较,如果匹配,它将使用以下代码:能否提供有关模板标记的更多信息?目前,我看不出li元素的子元素丢失的任何原因。由于您将整个li元素传递给模板(
),因此模板中的所有子体都应该仍然可用。从本质上讲,markup.xsl查看关键字库(keywords.xml)并将其与正在查看的文档进行比较,如果匹配,它将使用以下代码:youareastar!真的非常感谢你。你是一个明星!非常感谢。