需要在一个标记中标记某个段落并使用XSLT保留在另一个标记中

时间:2016-12-29 11:55:53

标签: xml xslt dita

我想在一个元素中使用第一组段落,在另一个元素中使用第二组段落

我的输入XML文件是:

<topic class="- topic/topic " outputclass="TOPIC-MLU-Body">
<title outputclass="MLU-Body">Body</title>
<body class="- topic/body ">
<p class="- topic/p ">Insulin is a medicine</p>
<fig class="- topic/fig ">
<image class="- topic/image "
          href="SBX0139003.jpg"
          outputclass="Fig-Image_Ref" placement="break"/>
<p class="- topic/p " outputclass="Fig-Text">Caption</p>
</fig>
<p class="- topic/p ">So, to try and lower your blood glucose levels</p>
</body>
</topic>

我用过的XSL:

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

<xsl:template match="topic[@outputclass='TOPIC-MLU-Body']">
<body>
<text>
 <text_top><xsl:value-of select="title|body/p"/></text_top>
 <text_bottom><xsl:value-of select="body/fig|p"/></text_bottom>
</text> 
<xsl:apply-templates/>
</body>
</xsl:template>

</xsl:stylesheet>

我需要将数字元素前面的段落作为“text-top”,然后将数字元素作为“text_bottom”

我的输出为:

    <mlu9_body>
    <mlu9_text>
    <text_top>Insulin is a medicine So, to try and lower your blood glucose levels</text_top>
    <text_bottom>Caption</text_bottom>
    </mlu9_text>
    </mlu9_body>

但我的预期输出是:

<mlu9_body>
<mlu9_text>
<text_top>Insulin is a medicine</text_top>
<text_bottom>So, to try and lower your blood glucose levels</text_bottom>
</mlu9_text>
</mlu9_body>

我使用Saxon PE和version = 2.0样式表。请给我这个建议。提前谢谢。

1 个答案:

答案 0 :(得分:3)

您说您当前获得的输出实际上并不对应于您提供的XSLT。例如,您的XSLT会输出<body>标记,但您的输出会显示<mlu9_body>标记。

此外,XSLT中的|运算符是union运算符,因此将返回两个节点集的并集。例如,你正在这样做

<xsl:value-of select="body/fig|p"/

在XSLT 2.0中,这将返回字符串值body/fig和两个p元素的字符串值的串联。

无论如何,试试这个XSLT,它会给你预期的输出:

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

<xsl:output method="xml" indent="yes" />

<xsl:template match="topic[@outputclass='TOPIC-MLU-Body']">
<mlu9_body>
<mlu9_text>
 <text_top><xsl:value-of select="body/p[1]"/></text_top>
 <text_bottom><xsl:value-of select="body/p[2]"/></text_bottom>
</mlu9_text> 
</mlu9_body>
</xsl:template>

</xsl:stylesheet>

注意,如果你真的想要定位在p元素之后发生的fig元素,你可以这样做......

<text_bottom><xsl:value-of select="body/fig/following-sibling::p"/></text_bottom>