Преобразовать строку в структуру XML XSLT - PullRequest
0 голосов
/ 07 сентября 2011

Я получаю структуру ввода как что-то вроде этого

 <ParameterSet>2|InterfaceMethod|EQ|I|GenericQuery|NIL</ParameterSet>
 <ParameterSet>1|TargetFilename|EQ|I|VendorMaster|NIL</ParameterSet>

вывод должен выглядеть примерно так:

  <Parameter>
    <Expression>2</Expression>
    <Parametername>InterfaceMethod</Parametername>
    <Parameter_Opt>EQ</Parameter_Opt>
    <Parameter_Sign>I</Parameter_Sign>
    <Range_Low_Value>GenericQuery</Range_Low_Value>
    <Range_High_Value>NIL</Range_High_Value>
  </Parameter>
  <Parameter>
    <Expression>1</Expression>
    <Parametername>TargetFilename</Parametername>
    <Parameter_Opt>EQ</Parameter_Opt>
    <Parameter_Sign>I</Parameter_Sign>
    <Range_Low_Value>VendorMaster</Range_Low_Value>
    <Range_High_Value>NIL</Range_High_Value>
  </Parameter>

Моя проблема в том, что тег преобразуется в

Может ли кто-нибудь предоставить пример кода.

Ответы [ 4 ]

3 голосов
/ 07 сентября 2011

Операция, которую вы ищете - превращение лексического XML в дерево узлов - называется синтаксическим анализом.Некоторые процессоры XSLT имеют функцию расширения, например, saxon: parse (), которая делает это (в XSLT 3.0 она доступна как fn: parse-xml ()).С другими процессорами вы можете написать свою собственную функцию расширения, вызывая Java или Javascript.

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

Спасибо всем за ваш вклад, я хотел это решение в XSLT, так как это единственный процессор, который у меня был, и он работает на версии 1.0.Получил работу с кодом ниже

        <xsl:variable name="TempArea">
&lt;ParameterSet&gt;2|InterfaceMethod|EQ|I|GenericQuery|NIL&lt;/ParameterSet&gt;
&lt;ParameterSet&gt;1|TargetFilename|EQ|I|VendorMaster|NIL&lt;/ParameterSet&gt;
&lt;ParameterSet&gt;1|CompanyCode|EQ|I|4900|NIL&lt;/ParameterSet&gt;</xsl:when>
        </xsl:variable>


            <xsl:call-template name="for.loop.Parameters">
                <xsl:with-param name="sourceNodes" select="substring-after($TempArea,'&lt;ParameterSet&gt;')"/>
            </xsl:call-template>

    <xsl:template name="for.loop.Parameters">
        <xsl:param name="sourceNodes"/>
        <xsl:variable name="temp">
            <xsl:choose>
                <xsl:when test="string-length($sourceNodes) &gt; '0'">
                    <xsl:value-of select="substring-before($sourceNodes,'&lt;/ParameterSet&gt;')"/>
                </xsl:when>
            </xsl:choose>
        </xsl:variable>

        <xsl:variable name="Expression" select="substring-before($temp, '|')"/>
        <xsl:variable name="remaining" select="substring-after($temp, '|')"/>
        <xsl:variable name="Name" select="substring-before($remaining, '|')"/>
        <xsl:variable name="remainingNext" select="substring-after($remaining, '|')"/>
        <xsl:variable name="Option" select="substring-before($remainingNext, '|')"/>
        <xsl:variable name="remainingNext1" select="substring-after($remainingNext, '|')"/>
        <xsl:variable name="Sign" select="substring-before($remainingNext1, '|')"/>
        <xsl:variable name="remainingNext2" select="substring-after($remainingNext1, '|')"/>
        <xsl:variable name="LowValue" select="substring-before($remainingNext2, '|')"/>
        <xsl:variable name="HighValue" select="substring-after($remainingNext2, '|')"/>

        <Parameter>
            <Expression>
                <xsl:value-of select="$Expression"/>
            </Expression>
            <Parametername>
                <xsl:value-of select="$Name"/>
            </Parametername>
            <Parameter_Opt>
                <xsl:value-of select="$Option"/>
            </Parameter_Opt>
            <Parameter_Sign>
                <xsl:value-of select="$Sign"/>
            </Parameter_Sign>
            <Range_Low_Value>
                <xsl:value-of select="$LowValue"/>
            </Range_Low_Value>
            <Range_High_Value>
                <xsl:value-of select="$HighValue"/>
            </Range_High_Value>
        </Parameter>

        <xsl:variable name="test">
            <xsl:value-of select="substring-after($sourceNodes,'&lt;/ParameterSet&gt;')"/>
        </xsl:variable>
        <xsl:if test="string-length($test)&gt; 1 ">
            <xsl:call-template name="for.loop.Parameters">
                <xsl:with-param name="sourceNodes">
                    <xsl:value-of select="substring-after($test,'&lt;ParameterSet&gt;')"/>
                </xsl:with-param>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
0 голосов
/ 07 сентября 2011

xslt хорош для реорганизации xml в разные xml, но не для преобразования не-xml в xml.Хотя вы могли бы сделать это с помощью xslt, используя множество вложенных substring-before и т. П., Будет гораздо проще, если вы сможете запустить его через sed или что-то сначала для создания xml из |строка с разделителями.

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

Ваши входные данные не являются XML, возможно, это кодированный (экранированный) XML. Итак, вам нужно превратить его в правильно сформированный XML, другими словами выполнить предварительную обработку. Затем примените XSL-преобразование.

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