#xslt #xslt-2.0
#xslt #xslt-2.0
Вопрос:
У меня есть входной xml следующим образом. В этом xml, иногда, <par class="endboxa">
отсутствует. Но, в любом случае, мне нужно сопоставить это поле ввода и вывода одинаково на выходе. Я имею в виду всякий раз, endboxa
когда отсутствует, тогда, в любом случае, мне нужно соответствовать этому. Любая помощь?
введите xml [код]
<par class="startboxa"><inline style="border-bottom-width: 3.0pt; border-bottom-style: solid; border-bottom-color: #ff0000; list-style-type: decimal; "></inline></par>
<par class="para" xml:lang="de"><inline style="list-style-type: decimal; ">Alle Aspekte der Verfügbarkeit und alle Phasen des Servicelebenszyklus sind bei den Service Design Aktivitäten zu berücksichtigen.</inline></par>
<par class="para" xml:lang="de"><inline style="list-style-type: decimal; ">Der Beitrag des Availability Management zu den Design-Aktivitäten ist:</inline></par>
<par class="para" xml:lang="de"><inline style="list-style-type: decimal; ">Können die Verfügbarkeitsanforderungen nicht eingehalten indem geprüft wird, ob eine entsprechend leistungsfähige Technologie in das vorgeschlagene IT-Design implementiert werden kann. Beispiel:</inline></par>
<par class="startboxa"><inline style="border-bottom-width: 3.0pt; border-bottom-style: solid; border-bottom-color: #ff0000; list-style-type: decimal; "></inline></par>
<par class="para" xml:lang="de"><inline style="list-style-type: decimal; font-weight: bold; ">Hinweise und Tipps</inline></par>
<par class="para" xml:lang="de"><inline style="list-style-type: decimal; ">Dokugen werden und in geeignete Governance-Strukturen integriert werden, die auf die Einführung neuer IT Services ausgerichtet sind.</inline></par>
<par class="endboxa"><inline style="list-style-type: decimal; border-top-width: 3.0pt; border-top-style: solid; border-top-color: #ff0000; "></inline></par>
[/code]
На данный момент мой код xslt мне нужно обновить на основе рекомендаций
<xsl:template match="par[@class = 'startboxa']">
<xsl:text disable-output-escaping="yes">amp;<div class="panel"amp;></xsl:text>
</xsl:template>
<xsl:template match="par[@class = 'endboxa']">
<xsl:text disable-output-escaping="yes">amp;</divamp;></xsl:text>
</xsl:template>
вывод XML [Теперь я получаю]
[код]
<div class="panel">
<p class="para">Alle Aspekte der Verfügbarkeit und alle Phasen des Servicelebenszyklus sind bei den Service Design Aktivitäten zu berücksichtigen.</inline></p>
<p class="para">Der Beitrag des Availability Management zu den Design-Aktivitäten ist:</inline></p>
<p class="para">Können die Verfügbarkeitsanforderungen nicht eingehalten indem geprüft wird, ob eine entsprechend leistungsfähige Technologie in das vorgeschlagene IT-Design implementiert werden kann. Beispiel:</inline></p>
<div class="panel">
<p class="para">Hinweise und Tipps</inline></p>
<p class="para">Dokugen werden und in geeignete Governance-Strukturen integriert werden, die auf die Einführung neuer IT Services ausgerichtet sind.</inline></p>
</div>
[/code]
Правильный выходной XML [который мне нужен]
[код]
<div class="panel">
<p class="para">Alle Aspekte der Verfügbarkeit und alle Phasen des Servicelebenszyklus sind bei den Service Design Aktivitäten zu berücksichtigen.</inline></p>
<p class="para">Der Beitrag des Availability Management zu den Design-Aktivitäten ist:</inline></p>
<p class="para">Können die Verfügbarkeitsanforderungen nicht eingehalten indem geprüft wird, ob eine entsprechend leistungsfähige Technologie in das vorgeschlagene IT-Design implementiert werden kann. Beispiel:</inline></p>
</div>[`here i need closing tag`]
<div class="panel">
<p class="para">Hinweise und Tipps</inline></p>
<p class="para">Dokugen werden und in geeignete Governance-Strukturen integriert werden, die auf die Einführung neuer IT Services ausgerichtet sind.</inline></p>
</div>
[/code]
Комментарии:
1. Пожалуйста, покажите свой код XSLT.
2. Я не мог сделать это возможным, поэтому я пытался и пытаюсь, а также копирую здесь
3. Почему вы создаете экранированные теги? Вы должны использовать обычные теги HTML.
4. хорошо, все в порядке, у вас есть ответ на мой вопрос, не могли бы вы помочь в этом?
Ответ №1:
Вы пометили это как XSLT 2.0, что хорошо, так как вы должны иметь возможность использовать xsl:for-each-group здесь, чтобы сгруппировать ваши элементы par, начиная с «startboxa»
<xsl:for-each-group select="par" group-starting-with="par[@class='startboxa']">
При таком подходе вам на самом деле не нужно беспокоиться о том, существует ли «endboxa» или нет. Просто выведите div и выведите все внутри него
<div>
<xsl:apply-templates select="current-group()" />
</div>
Это приведет к появлению «startboxa» и «endboxa» (если оно существует), поэтому вам просто нужны два совпадающих шаблона, чтобы игнорировать их (если вы не хотите выводить для них что-то другое)
<xsl:template match="par[@class = 'startboxa']" />
<xsl:template match="par[@class = 'endboxa']" />
Попробуйте этот XSLT. Предполагается, что ваш текущий XML является частью родительского элемента с именем parent:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes"/>
<xsl:template match="parent">
<xsl:for-each-group select="par" group-starting-with="par[@class='startboxa']">
<div>
<xsl:apply-templates select="current-group()" />
</div>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="par[@class = 'para']">
<p><xsl:apply-templates /></p>
</xsl:template>
<xsl:template match="par[@class = 'startboxa']" />
<xsl:template match="par[@class = 'endboxa']" />
</xsl:stylesheet>
РЕДАКТИРОВАТЬ: если вы действительно хотели решение XSLT 1.0, вы можете воспроизвести «group-starting-with», определив ключ, который группирует элементы par по их первому самому предыдущему элементу «startboxa»
<xsl:key name="par" match="par[not(@class='startboxa')]"
use="generate-id(preceding-sibling::par[@class='startboxa'][1])" />
Затем вы меняете xsl:for-each-group на просто xsl:for-each, чтобы получить элемент ‘starting’
<xsl:for-each select="par[@class='startboxa']">
Затем, чтобы получить элементы в группе, вы можете использовать ключ
<xsl:apply-templates select="key('par', generate-id())" />
Основное отличие заключается в том, что ключ фактически не включает сам элемент ‘startboxa’, поэтому вам не нужен дополнительный шаблон, чтобы игнорировать его.
Попробуйте этот XSLT 1.0
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:key name="par" match="par[not(@class='startboxa')]" use="generate-id(preceding-sibling::par[@class='startboxa'][1])" />
<xsl:template match="parent">
<xsl:for-each select="par[@class='startboxa']">
<div>
<xsl:apply-templates select="key('par', generate-id())" />
</div>
</xsl:for-each>
</xsl:template>
<xsl:template match="par[@class = 'para']">
<p><xsl:apply-templates /></p>
</xsl:template>
<xsl:template match="par[@class = 'endboxa']" />
</xsl:stylesheet>
Комментарии:
1. Его можно заставить работать в XSLT 1.0, но вы пометили свой вопрос XSLT 2.0, и если вы можете использовать XSLT 2.0, вы должны! Если вы хотите получить ответ на XSLT 1.0, вам нужно изменить свой вопрос, чтобы было ясно, что вы хотите решение на XSLT 1.0. Спасибо.
2. Я отредактировал свой ответ, чтобы показать решение XSLT 1.0 в этом случае.