XSLT / XPath:如何在除特定元素之外的所有元素上使用xsl:apply-templates

时间:2012-03-17 18:32:52

标签: xslt xpath

我有以下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做到这一点吗?

3 个答案:

答案 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.