Я хочу взять первый набор абзацев в одном элементе и второй набор абзацев в другом элементе
Мой входной 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>
Мне нужны абзацы перед элементом figure как «text-top» и после элементов figure как «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 и таблицу стилей версии 2.0. Пожалуйста, дайте мне предложения по этому поводу. Заранее спасибо.
1 ответ
Выходные данные, которые вы получаете в настоящее время, на самом деле не соответствуют предоставленному вами XSLT. Например, ваш XSLT выводит тег <body>
, но ваш вывод показывает тег <mlu9_body>
.
Кроме того, оператор |
в XSLT является оператором объединения и поэтому возвращает объединение двух наборов узлов. Например, вы делаете это
<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>
Похожие вопросы
Новые вопросы
xml
XML (Extensible Markup Language) - это формат структурированного документа, определяющий правила кодирования текста. При использовании этого тега включайте дополнительные теги, такие как язык программирования, наборы инструментов, используемые технологии XML и другие теги, описывающие среду, в которой опубликована проблема. Гибкость XML обеспечивает широкий спектр применений для передачи человеческих и машинных данных, в том числе конкретных инструментов и библиотек.