我们正在使用XSLT将XML转换为HTML。在其中的一部分中,我们有一个元素列表,我们需要提取字符串数据,减去任何XML标记,以便在另一个位置使用。
目前的XSL很简单:
<xsl:variable name="label_Text" select=".//column_header_1"/>
...
<xsl:value-of select="$label_Text"/>
这在大多数情况下都可以正常工作,但有些column_header元素包含应排除的某些子节点。以此XML代码段为例:
&LT; column_header_1&GT;
Foo&lt; textstyle_bold&gt; Bar&lt; / textstyle_bold&gt; &lt; editor_note&gt;来自编辑的说明&lt; / editor_note&gt;
&LT; / column_header_1&GT;
当前的XSL返回“来自编辑器的Foo Bar note”但我们不希望editor_note节点包含在此位置。上述代码段的预期结果将是“Foo Bar”。
我觉得我应该可以使用像
<xsl:value-of select="$label_Text[not(editor_note)]"/>
但到目前为止我还没有能够解决这个问题。
请注意,不应该从整个文档中排除editor_note元素,只应从此特定值中排除它,这似乎排除了使用空模板删除节点。
答案 0 :(得分:1)
使用模式形式应用模板。
在列标题中,以“非编辑注释”模式调用xsl:apply-templates
,禁止此类注释。
<xsl:apply-templates select="." mode="non-editor-note"/>
然后设置一些仅在“非编辑注释”模式下工作的提取器:
<xsl:template match="editor_note" mode="non-editor-note"/>
<xsl:template match="*" mode="non-editor-note">
<xsl:value-of select="."/>
</xsl:template>
您可能需要对value-of
元素进行一些调整,但这应该可以完成您想要的所有内容。
答案 1 :(得分:1)
Bob Dalgleish的答案的编辑/更正版本:
使用模式形式应用模板。
在列标题中,以“非编辑注释”模式调用xsl:apply-templates
,禁止此类注释。
<xsl:apply-templates select="." mode="non-editor-note"/>
“非编辑注释”模式中只需要一个特定的规则:
<xsl:template match="editor_note" mode="non-editor-note"/>
对于所有其他节点,默认模板规则完全按照您的要求执行:忽略标记并递归到文本节点,然后复制文本节点。