Xslt 基于xml文件顺序的xsl解析

Xslt 基于xml文件顺序的xsl解析,xslt,Xslt,为了将一种xml格式转换为另一种xml格式,我使用xsl。我在xsl文件中编写了一些模板。 我在翻译顺序方面遇到一些问题,如下所示 我的xsl模板: <xsl:template match="rhs" name="rhsTemplate"> <xsl:if test="brl:retract | retract!= ''"> <xsl:for-each select="brl:retract

为了将一种xml格式转换为另一种xml格式,我使用xsl。我在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>

$Event1
输出:

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

收回(事件1);
试一试{
期望输出:

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

试一试{
收回(事件1);
我的要求是,不管xsl模板内的条件如何,翻译都需要根据输入xml文件顺序进行。在我的xsl模板中,我在trycatch if条件之前有用于retract的if条件。因此,翻译为“retract”首先发生,然后转换trycatch标记,尽管我的输入xml在retract标记之前包含trycatch标记

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

您的输出是按该顺序的,因为这就是模板输出它的方式;它专门输出任何“收回”块,然后输出任何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在默认情况下会这样做,但考虑到它的名称,我认为这可能是有原因的


显然,您需要扩展它以适应名称空间问题;老实说,我不清楚文本
从何处收回(
来自,但希望这个解决方案能给你一些指导。

我还没有详细研究你的问题,但一眼,你就知道了
brl:retract | retract!='
。这应该是
brl:retract | brl:retract!='
?也就是说,第二次引用
retract
时没有指定名称空间是的,它是brl:retract | retract!=''only。有时xml文件可能带有名称空间,有时没有名称空间。为了处理这个问题,我添加了两个senarios。