XSLT:需要将名称值对内容转换为XML

时间:2017-09-29 16:00:33

标签: xslt-1.0 xslt-2.0

我是XSLT的新手。我需要将包含名称值对的XML转换为目标XML。 我需要生成一个目标XML,其中每个FieldName是一个元素名称,它的值是FieldValue。请在下面找到我需要的输出。 在此先感谢您的帮助。

源XML:



<SC>
	<Header>
		<Record>
			<FieldName>Schema</FieldName>
			<FieldValue>OrderHeader</FieldValue>
		</Record>
		<Record>
			<FieldName>Order</FieldName>
			<FieldValue>1234</FieldValue>
		</Record>
	</Header>
	<Detail>
		<Record>
			<FieldName>Schema</FieldName>
			<FieldValue>OrderItem</FieldValue>
		</Record>
		<Record>
			<FieldName>Item</FieldName>
			<FieldValue>1</FieldValue>
		</Record>
		<Record>
			<FieldName>Qty</FieldName>
			<FieldValue>10</FieldValue>
		</Record>
	</Detail>
	<Detail>
		<Record>
			<FieldName>Schema</FieldName>
			<FieldValue>OrderItem</FieldValue>
		</Record>
		<Record>
			<FieldName>Item</FieldName>
			<FieldValue>2</FieldValue>
		</Record>
		<Record>
			<FieldName>Qty</FieldName>
			<FieldValue>20</FieldValue>
		</Record>
	</Detail>
</SC>
&#13;
&#13;
&#13;

要生成的目标XML:

&#13;
&#13;
<SC>
    <OrderHeader>
        <Order>1234</Order>
    </OrderHeader>
    <OrderItem>
        <Item>1</Item>
        <Qty>10</Qty>
    </OrderItem>
    <OrderItem>
        <Item>2</Item>
        <Qty>20</Qty>
    </OrderItem>
</SC>
&#13;
&#13;
&#13;

我试过的XSLT:我没有得到所需的输出

<xsl:template match="Header">
    <xsl:apply-templates select="Record"/>
</xsl:template>
<xsl:template match="Record">
    <xsl:if test="FieldName = 'Structure'">
        <xsl:element name="{FieldValue}">
            <xsl:value-of select="./text()"/>
        </xsl:element>
    </xsl:if>

    <xsl:element name="{FieldName}">
        <xsl:value-of select="FieldValue"/>
    </xsl:element>
</xsl:template>

2 个答案:

答案 0 :(得分:0)

您似乎希望将第一个Record子项作为容器元素进行处理,并按照您的描述转换以下兄弟:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:output indent="yes"/>

    <xsl:template match="SC">
        <xsl:copy>
            <xsl:apply-templates select="*/Record[1]"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="SC/*/Record[1]">
        <xsl:element name="{FieldValue}">
            <xsl:apply-templates select="following-sibling::Record"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="SC/*/Record[position() gt 1]">
        <xsl:element name="{FieldName}">
            <xsl:value-of select="FieldValue"/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

这是另一个类似于马丁的选项。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="Header|Detail">
    <xsl:element name="{Record[1]/FieldValue}">
      <xsl:apply-templates select="Record[position()>1]"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="Record">
    <xsl:element name="{FieldName}">
      <xsl:value-of select="FieldValue"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>