如果缺少此相关代码,则需要应用关闭框

时间:2014-06-17 10:01:13

标签: 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>

[/代码]

我的xslt代码截至目前,我需要根据建议更新

<xsl:template match="par[@class = 'startboxa']">
<xsl:text disable-output-escaping="yes">&lt;div class="panel"&gt;</xsl:text>
</xsl:template>

<xsl:template match="par[@class = 'endboxa']">
<xsl:text disable-output-escaping="yes">&lt;/div&gt;</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>

[/代码]

1 个答案:

答案 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>