如何使用属性值删除元素的内容?

时间:2016-12-30 06:52:17

标签: xml xslt dita

我想通过使用该属性值删除这两个段落,我尝试了下面的内容,但它在输出中发生,

我的输入XML是:

<chapter outputclass="chapter-Body">
<body class="- chapter/body ">
<p class="- chapter/p ">why now?</p>
<p class="- chapter/p " outputclass="Image_Size">Banner</p>
<fig>
<image href="3.jpg" outputclass="Fig-Image_Ref"/>
</fig>
<p class="- chapter/p ">But for others, it may not be.</p>
<image ref="4.png" outputclass="Image_Ref"/>
<p class="- chapter/p " outputclass="Image_Size">Small</p>
<p class="- chapter/p ">As result</p>
</body>
</chapter>

我使用的XSL:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="chapter[@outputclass='chapter-Body']">
<body>
<text>
<text_top><p><xsl:value-of select="body/fig/preceding-sibling::p[1]"/></p>
 </text_top>

<text_bottom><p><xsl:value-of select="body/fig/following-sibling::p[1]"/></p>
  <p><xsl:value-of select="body/fig/following-sibling::p[2]"/></p>
 </text_bottom>
</text> 
<xsl:apply-templates/>
</body>
</xsl:template>

<xsl:template match="p[@outputclass='Image_Size']"/>

</xsl:stylesheet>

我得到的XML输出:

<body>
<text>
<text_top>
<p>Banner</p>
</text_top>
<text_bottom>
<p>But for others, it may not be.</p>
<p>Small</p>
</text_bottom>
</text>
</body>

但我希望如此:

<body>
<text>
<text_top>
<p>why now?</p>
</text_top>
<text_bottom>
<p>But for others, it may not be.</p>
<p>As result</p>
</text_bottom>
</text>
</body>

我使用了特定的两个模板的模板,但是它会输出。如何使用相同的XSLT解决此问题?

1 个答案:

答案 0 :(得分:2)

前一个兄弟轴的顺序是反向文档顺序,因此当您执行body/fig/preceding-sibling::p[1]时,会得到紧跟在p元素之前的fig。你之前需要一个,所以你应该做body/fig/preceding-sibling::p[2]

同样,您需要p之后的第1个和第3个fig元素,因此您也应该相应地调整索引。请注意,与p[@outputclass='Image_Size']匹配的当前模板根本不会被使用,因为XSLT中没有任何内容可以xsl:apply-templates来选择它们。

试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="chapter[@outputclass='chapter-Body']">
      <body>
         <text>
            <text_top>
               <p><xsl:value-of select="body/fig/preceding-sibling::p[2]"/></p>
            </text_top>

            <text_bottom>
               <p><xsl:value-of select="body/fig/following-sibling::p[1]"/></p>
               <p><xsl:value-of select="body/fig/following-sibling::p[3]"/></p>
            </text_bottom>
         </text> 
      </body>
   </xsl:template>
</xsl:stylesheet>

话虽如此,看起来你想要实现的是选择p之前和之后的所有fig个元素,但输出类别为&#34; Image_Size& #34;

如果是这种情况,请尝试这种更通用的XSLT。请注意,由于第一个模板中的p[@outputclass='Image_Size'],现在使用了与xsl:apply-templates匹配的模板。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="chapter[@outputclass='chapter-Body']">
      <body>
         <text>
            <text_top>
               <xsl:apply-templates select="body/fig/preceding-sibling::p" />
            </text_top>

            <text_bottom>
               <xsl:apply-templates select="body/fig/following-sibling::p" />
            </text_bottom>
         </text> 
      </body>
   </xsl:template>

   <xsl:template match="p[@outputclass='Image_Size']"/>

   <xsl:template match="p">
       <p><xsl:value-of select="." /></p>
   </xsl:template>
</xsl:stylesheet>