我想通过使用该属性值删除这两个段落,我尝试了下面的内容,但它在输出中发生,
我的输入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解决此问题?
答案 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>