我没有使用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>
有人可以帮我吗?
谢谢, 库马尔
答案 0 :(得分:1)
我认为问题出在这行
<xsl:template match="name//text()[not(parent::ysample)]">
这里有两个问题
name/text()
匹配作为name
的直接子级的文本节点,因此适用于文本节点的条件not(parent::ysample)
永远不会为真,因为父级始终为{ {1}} 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>