同时提取和转换数据

时间:2013-09-30 15:07:56

标签: xml xslt

这是我的XML:

<p>
  <t>bla bla bla <XX>bla<REG /> bla</XX> bla</t>
  <t>bli bli bli <XX>bli bli</XX> bli</t>
  <t>blo <REG /> blo blo <XX>blo blo <REG /></XX></t>
</p>

我想提取包含在XX中的文本并用斜杠替换REG - 同时(为了得到bla / bla - 第一行的例子)。

我可以一次做两个,但我无法将这两个规则都应用到我的标签中。是否可以使用XSLT 1.0?

以下是我的XSLT规则(非常基本):

<xsl:template match="REG">
  <xsl:text> / </xsl:text>
</xsl:template>

<xsl:template match="XX">
  <xsl:value-of select="normalize-space(.)"/>
</xsl:template>

我尝试使用substring-before和substring-after替换为字符串(斜杠),但它不能用于标记。

提前致谢。

1 个答案:

答案 0 :(得分:1)

问题在于匹配 XX 的模板。查看文档中 XX 节点的特定示例,例如

<XX>bla<REG /> bla</XX>

然后这个 XX 元素实际上有三个子节点;文本节点“blah”, REG 元素和另一个文本节点“blah”。所以,你应该想到只有单一内容的 XX 。在其上执行 xsl:value-of ,只需连接其中的所有后代文本节点。

您需要做的是将当前与 XX 匹配的模板替换为两个模板。

第一个匹配 XX 当前,但只是将处理传递给其子元素(即不输出XX)。第二个模板将专门匹配 XX 元素的子文本节点,然后您可以在其中输出文本

尝试使用这两个模板

<xsl:template match="XX">
  <xsl:apply-templates />
</xsl:template>

<xsl:template match="XX/text()">
  <xsl:value-of select="normalize-space(.)"/>
</xsl:template>