我有以下XML代码:
<detaileddescription>
<para>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum aliquam
interdum erat, <computeroutput>monospace output</computeroutput> eget rhoncus nunc
porttitor ut. Ut ac metus sed erat rutrum dignissim.
<parameterlist kind="param">
<parameteritem>
<parameternamelist>
<parametername>item1</parametername>
</parameternamelist>
<parameterdescription>
<para>Param description.</para>
</parameterdescription>
</parameteritem>
</parameterlist>
<simplesect kind="return">
<para>
<computeroutput>ERR</computeroutput> mattis nunc sed velit ultricies
volutpat. Suspendisse potenti. Vivamus nec ligula blandit urna lobortis
tempus.
</para>
</simplesect>
</para>
</detaileddescription>
我只想将xsl:apply-templates用于detaileddescription/para
元素的文本节点子元素和文本节点内部的<computeroutput>
元素。换句话说,我想仅将模板应用于以下内容:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum aliquam
interdum erat, <computeroutput>monospace output</computeroutput> eget rhoncus nunc
porttitor ut. Ut ac metus sed erat rutrum dignissim.
有人能告诉我如何使用XSLT 2.0和XPath 2.0做到这一点吗?
答案 0 :(得分:2)
这里有一个,虽然可能不是最好的方法。我给你烤了cake
我创建了一个复制模板,它复制了所有内容,最后两个模板是停止模板,不会产生任何输出。
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="detaileddescription">
<xsl:apply-templates select="para"/>
</xsl:template>
<xsl:template match="para">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="parameterlist"/>
<xsl:template match="simplesect"/>
我在第二个模板中进行了编辑:这将删除(或者不是复制)<detaileddescription>
标记。
答案 1 :(得分:2)
如果我理解你的问题,这应该有效:
<xsl:apply-templates select="detaileddescription/para/(text()|computeroutput)"/>
当然,取决于上下文说明。否则,您也可能意味着相应的tempate只适合您想要的那些元素:
<xsl:template match="detaileddescription/para/(text()|computeroutput)"/>
<xsl:copy-of select="." />
<!-- or whatever you want to do with it -->
</xsl:template>
希望这有帮助, [R
答案 2 :(得分:1)
此转化:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="*/para[1]/(text()|computeroutput)"/>
</xsl:template>
<xsl:template match="computeroutput">
<xsl:sequence select="."/>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档:
<detaileddescription>
<para>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum aliquam
interdum erat, <computeroutput>monospace output</computeroutput> eget rhoncus nunc
porttitor ut. Ut ac metus sed erat rutrum dignissim.
<parameterlist kind="param">
<parameteritem>
<parameternamelist>
<parametername>item1</parametername>
</parameternamelist>
<parameterdescription>
<para>Param description.</para>
</parameterdescription>
</parameteritem>
</parameterlist>
<simplesect kind="return">
<para>
<computeroutput>ERR</computeroutput> mattis nunc sed velit ultricies
volutpat. Suspendisse potenti. Vivamus nec ligula blandit urna lobortis
tempus.
</para>
</simplesect>
</para>
</detaileddescription>
只对所需节点进行处理(仅应用模板),对于此演示文件,只需将这些节点复制到输出:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum aliquam
interdum erat, <computeroutput>monospace output</computeroutput> eget rhoncus nunc
porttitor ut. Ut ac metus sed erat rutrum dignissim.