XSLT / XPath: как использовать xsl: apply-templates на всех элементах, кроме определенных - PullRequest
3 голосов
/ 17 марта 2012

У меня есть следующий 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 голосов
/ 18 марта 2012

Если я правильно понимаю ваш вопрос, это должно сработать:

<xsl:apply-templates select="detaileddescription/para/(text()|computeroutput)"/>

конечно, в зависимости от контекста. В противном случае вы также можете указать соответствующий шаблон, который будет соответствовать только тем элементам, которые вам нужны:

<xsl:template match="detaileddescription/para/(text()|computeroutput)"/>
  <xsl:copy-of select="." /> 
  <!-- or whatever you want to do with it -->
</xsl:template>

Надеюсь, это поможет, R

2 голосов
/ 17 марта 2012

здесь один, хотя, вероятно, не лучший способ сделать это.я испекла вам торт

я создал шаблон копирования, который копирует все, а последние два шаблона являются стоп-шаблонами, которые не производят никакого вывода.

<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 голос
/ 19 марта 2012

Это преобразование :

<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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...