XSLT:排除子节点

时间:2013-11-19 00:00:08

标签: xml xslt selector

我们正在使用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元素,只应从此特定值中排除它,这似乎排除了使用空模板删除节点。

2 个答案:

答案 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"/>

对于所有其他节点,默认模板规则完全按照您的要求执行:忽略标记并递归到文本节点,然后复制文本节点。