我输入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>
[/代码]
我的xslt代码截至目前,我需要根据建议更新
<xsl:template match="par[@class = 'startboxa']">
<xsl:text disable-output-escaping="yes"><div class="panel"></xsl:text>
</xsl:template>
<xsl:template match="par[@class = 'endboxa']">
<xsl:text disable-output-escaping="yes"></div></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>
[/代码]
更正输出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>
[/代码]
答案 0 :(得分: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>