将字符串转换为XML结构XSLT

时间:2011-09-07 05:29:35

标签: xslt

我正在获得像这样的输入结构

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

我的问题是标签被转换为&lt; ParameterSet&amp; gt,当我写入另一个重复结构时,我无法使用foreach。

任何人都可以提供一些示例代码。

4 个答案:

答案 0 :(得分:3)

您正在寻找的操作 - 将词汇XML转换为节点树 - 称为解析。一些XSLT处理器具有扩展功能,例如, saxon:parse(),这样做(在XSLT 3.0中,它可以作为fn:parse-xml()开箱即用)。使用其他处理器,您可以通过调用Java或Javascript来编写自己的扩展函数。

答案 1 :(得分:0)

您的输入数据不是XML,可能是编码(转义)的XML。因此,您需要将其转换为格式良好的XML,换句话说,执行预处理。然后应用XSL转换。

答案 2 :(得分:0)

xslt善于将xml重新排列到不同的xml中,而不是将非xml更改为xml。虽然可以使用大量嵌套substring-before之类的xslt来执行此操作,但如果您可以通过sed或者先创建xml来运行它会更容易超出| -delimited字符串。

答案 3 :(得分:0)

感谢大家的意见,我想在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>