XSL - 将数组元素转换为具有element_name +索引名称的独立元素列表

时间:2014-07-22 20:14:07

标签: arrays xml xslt transformation

我对XSL转换有非常基本的了解。 我需要将数组转换为独立元素列表,如下所示:

输入:

<Fields>
    <Field>
         <Name>One</Name>
         <Value>1</Value>
    </Field>
    <Field>
        <Name>Two</Name>
        <Value>2</Value>
    </Field>
    <Field>
        <Name>Three</Name>
        <Value>3</Value>
    </Field>
    <Field>
        <Name>Four</Name>
        <Value>4</Value>
    </Field>
    </Fields>

期望的输出:

<Fields>
     <Field1>
            <Name>One</Name>
            <Value>1</Value>
        </Field1>
        <Field2>
            <Name>Two</Name>
            <Value>2</Value>
        </Field2>
        <Field3>
            <Name>Three</Name>
            <Value>3</Value>
        </Field3>
        <Field4>
            <Name>Four</Name>
            <Value>4</Value>
        </Field4>
</Fields>

可行吗? 感谢任何建议。

2 个答案:

答案 0 :(得分:0)

  

这个问题背后的真正原因是消费者的软件   如果其名称未由静态xml表示,则无法映射字段   节点

我不确定究竟是什么意思,但如果您确定这是您想要的结果,请尝试:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="Field">
    <xsl:element name="Field{position()}">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

来自michael.hor257k的回答非常有效并且完全回答了我原来的问题,但我意识到这种转换的输出更适合我的需求,提供字段名称是唯一的。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/*">
    <Fields>
      <xsl:apply-templates select="Field" />
    </Fields>
  </xsl:template>

  <xsl:template match="Field">
    <xsl:element name="{Name}">

     <xsl:element name="Value">
      <xsl:value-of select="Value" />
      </xsl:element>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

输出:

<?xml version="1.0"?>
<Fields>
    <One>
        <Value>1</Value>
    </One>
    <Two>
        <Value>2</Value>
    </Two>
    <Three>
        <Value>3</Value>
    </Three>
    <Four>
        <Value>4</Value>
    </Four>
</Fields>