首页 文章

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

提问于
浏览
3

我有以下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 回答

  • 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

    这是一个,虽然可能不是最好的方法 . 我给你烤了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

    This transformation

    <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>
    

    when applied on the provided XML document

    <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>
    

    processes (applies templates to) only the wanted nodes and for this demo puposes just copies these nodes to the output

    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.
    

相关问题