xslt-向文本中添加元素,但删除之间的元素

时间:2018-09-14 05:19:17

标签: xslt

我没有使用XSLT很多。但是不知何故,我正在努力获得以下各项的预期输出。

输入1:

<name>xxxx <xsample>dddd</xsample> zzzz</name>

输出1:

<p><t>xxxx dddd zzzz</t></p> // here I don't want to wrap the tag

输入2

<name>xxxx <ysample>dddd</ysample> zzzz</name>

输出2:

<p><t>xxxx </t><t>dddd</t><t> zzzz</t></p>

我尝试使用下面的xslt代码:

<xsl:template match="name">
<p>
<xsl:apply-templates select="*|@*|comment()|processing-instruction()|text()"/>
</p>
</xsl:template>
<xsl:template match="name/text()[not(parent::ysample)]">
<t><xsl:value-of select="."/></t>
</xsl:template>
<xsl:template match="name/ysample">
<t><xsl:value-of select="."/></t>
</xsl:template>

有人可以帮我吗?

谢谢, 库马尔

2 个答案:

答案 0 :(得分:1)

我认为问题出在这行

<xsl:template match="name//text()[not(parent::ysample)]">

这里有两个问题

  1. name/text()匹配作为name的直接子级的文本节点,因此适用于文本节点的条件not(parent::ysample)永远不会为真,因为父级始终为{ {1}}
  2. 这可能是一个错字,但是您可能想在此处检查name以实现逻辑,尤其是因为您已经有一个匹配xsample的模板

改为尝试以下行:

ysample

答案 1 :(得分:0)

您也可以在XSLT 2.0中通过分组进行检查

<xsl:template match="name">
    <p>
        <xsl:for-each-group select="node()" group-adjacent="self::text() or self::xsample">
            <t>
                <xsl:value-of select="current-group()"/>
            </t>
        </xsl:for-each-group>            
    </p>
</xsl:template>