我尝试在下面的XML上运行XSLT,以便用新元素包装某些PI之间的文本:
输入XML:
<doc>
<p>
<?addition?>hello<?addition?> text1
</p>
<p>text2</p>
<p>
<?addition?>bye<?addition?> text2
</p>
</doc>我尝试将addition-start和addition-end之间的文本包装在一个<u>元素中,如下所示。
所需输出:
<doc>
<p>
<u>hello</u> text1
</p>
<p>text2</p>
<p>
<u>bye</u> text2
</p>
</doc>我当前的XSLT错误地获取了不在PI的当前样式表之间的文本节点:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="#all"
version="2.0">
<xsl:template
match="@* | node()">
<xsl:copy
copy-namespaces="no"
exclude-result-prefixes="#all"
inherit-namespaces="no">
<xsl:apply-templates
select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//p/text()[preceding::processing-instruction('addition')]
[following::processing-instruction('addition')]">
<u><xsl:value-of select="." /></u>
</xsl:template>
</xsl:stylesheet>有没有办法调整我的XSLT来实现这一点,并且只用<u>包装由PI包围的文本
发布于 2020-03-25 02:49:10
我觉得你想
<xsl:template match="p/text()[preceding-sibling::node()[1][self::processing-instruction('addition')]]
[following-sibling::node()[1][self::processing-instruction('addition')]]">
<u><xsl:value-of select="." /></u>
</xsl:template>https://xsltfiddle.liberty-development.net/ehVZvvF
而且,正如Daniel Haley在他的评论中指出的那样,您还可以添加一个空的模板<xsl:template match="processing-instruction('addition')"/>来删除处理指令。
https://stackoverflow.com/questions/60836885
复制相似问题