解析基于使用xsl的xml文件顺序

时间:2011-09-13 08:00:18

标签: xslt

要将一个xml格式转换为其他xml格式我正在使用xsl.I在我的xsl文件中写了几个模板。 我正面临着翻译顺序的一些问题。

我的xsl模板:

 <xsl:template match="rhs" name="rhsTemplate">

                <xsl:if test="brl:retract | retract!= ''">
                    <xsl:for-each select="brl:retract | retract">
                        <xsl:element name="freeForm">
                            <xsl:element name="text">
                                <xsl:apply-templates select="." />
                            </xsl:element>
                        </xsl:element>
                    </xsl:for-each>
                </xsl:if>


    <xsl:if test="brl:tryCatchBlock | tryCatchBlock!= ''">
                        <xsl:if test="brl:tryCatchBlock/brl:try | tryCatchBlock/try!= ''">
                            <xsl:element name="freeForm">
                                <xsl:element name="text">
                                    <xsl:text>try{</xsl:text>
                                </xsl:element>
                            </xsl:element>


</xsl:template>

当我发送以下xml文件作为输入时,我得到的输出是不可取的。

                               <rhs>  
                                <tryCatchBlock identifier="8" order="0">
                                <try>
                                </try>
                                </tryCatchBlock>
                <retract identifier="1" order="1">
                    <variableName>$Event1</variableName>
                </retract>

输出:

<freeForm>
<text>retract($Event1);</text>
</freeForm>
<freeForm>
<text>try{</text>
</freeForm>

期望的输出:

<freeForm>
<text>try{</text>
</freeForm>
<freeForm>
<text>retract($Event1);</text>
</freeForm>

我的要求与xsl模板内的条件无关,根据输入的xml文件顺序,翻译需要发生。在我的xsl模板中,如果条件是在trycatch之前收回条件,那么条件就是条件。转换为“收缩”首先发生,然后它翻译trycatch标签虽然我的输入xml包含trycatch标签,但是在缩回标签之前。

请提供一些指示,根据输入的xml内容顺序进行翻译。 但是所需的输出如下(根据输入的xml顺序)。

1 个答案:

答案 0 :(得分:0)

您的输出是按顺序排列的,因为这是模板输出的方式;它专门输出任何'收回'块,然后输出任何try / catch块。

我建议稍作重新设计:

<xsl:template match="rhs" name="rhsTemplate">
  <xsl:apply-templates />
</xsl:template>

<xsl:template match="retract">
  <xsl:element name="freeForm">
    <xsl:element name="text">
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:element>
</xsl:template>

<xsl:template match="tryCatchBlock">
  <xsl:element name="freeForm">
    <xsl:element name="text">
      <xsl:text>try{</xsl:text>
    </xsl:element>
  </xsl:element>
</xsl:template>

第一个模板可能是多余的;默认情况下,XSLT默认执行此操作,但鉴于它已命名,我认为可能有这样的原因。

显然,您需要扩展它以适应名称空间问题;说实话,我不清楚文本retract(的来源,但希望这个解决方案应该给你一些指示。

相关问题