Разбор На основе порядка файлов xml с использованием xsl - PullRequest
0 голосов
/ 13 сентября 2011

Чтобы перевести один 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-файл в качестве входных данных, я получаю вывод, который не нуженone.

                               <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, у меня есть условие if для retract перед trycatch, если condition.hence сначала выполняется перевод для «retract», а затем перевод тега trycatch, хотя мой входной xml содержит тег trycatch до retracttag.

Пожалуйста, дайте мне несколько указателей, чтобы сделать перевод, основанный на порядке ввода содержимого XML.Но желаемый вывод такой, как показано ниже (в соответствии с порядком ввода XML).

1 Ответ

0 голосов
/ 13 сентября 2011

Ваш вывод в таком порядке, потому что именно так его выводит ваш шаблон; он специально выводит любые блоки 'retract', а затем выводит любые блоки 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(, но, надеюсь, это решение даст вам некоторые подсказки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...