如何在节点文本之后但在子元素之前添加空格?

时间:2013-10-31 18:31:14

标签: xml xslt xpath

以下是我的示例XML:

<index>
    <indextext>
        <index.text1>Here goes some text<link attribute1="this" attribute2="that">and here is a link</link></index.text1>
    </indextext>
</index>

现在我的问题是我需要分隔index.text1节点和link节点的文本。

这就是事情。我尝试通过获取preceding-sibling节点的link来做到这一点,我能够实际执行此操作,但由于某种原因我丢失了链接属性 - 换句话说,该链接包含属性使其能够链接到不同的文档,在这种情况下丢失。注意:一旦我弄乱了<template match="link">,我就失去了这些属性。

我做的是:

  <xsl:template match="index.text1//link">
    <xsl:text><![CDATA[  ]]></xsl:text>
    <xsl:apply-templates/>    
  </xsl:template>

......但这不起作用,如上段所述。

我的问题是如何以某种方式选择link节点之前的文本,或者如何选择link节点本身并在其之前输入空格,但保留所有属性?< / p>

奖金问题 - 有没有办法让我自动选择一系列以名称index.text开头的不同节点?例如,有没有办法可以自动选择index.textindex.text1index.text2等? index.text*会有效吗?

已解决 - 我弄清楚问题是什么。基本上我需要调用实际处理文档链接的“主”代码中的另一个模板。还有更多的代码可以让自己熟悉!

1 个答案:

答案 0 :(得分:1)

如果您知道所有这些链接元素前面都有空格,那么只需执行

即可
  <xsl:template match="index.text1//link">
    <xsl:text> </xsl:text>
    <xsl:call-template name="identity"/>   
  </xsl:template>

<xsl:template match="@* | node()" name="identity">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

对于外卡元素匹配,请使用

  <xsl:template match="*[starts-with(local-name(), 'index.text')]//link">
    <xsl:text> </xsl:text>
    <xsl:call-template name="identity"/>   
  </xsl:template>