XSLT:转换名称/值对并转换 XML [英] XSLT: Convert Name/Value pair and transform an XML

查看:30
本文介绍了XSLT:转换名称/值对并转换 XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要将名称值对转换为 XML.我能够生成一个 XML,但元素名称应该分组并且不应该重复.请参阅下文.FieldValue 元素在 Detail 节点中包含 2 个 OrderItem 值.如果 FieldValue 与 OrderItem 重复,则结果应分组到一个 OrderItem 节点中.请帮忙.

I need to convert a name value pair into XML. I'm able to generate an XML, but the element name should be grouped and it should not be duplicated. Please see below. The FieldValue element contains 2 OrderItem values in the Detail node. If the FieldValue with OrderItem repeats, then the result should be grouped into one OrderItem node. Please help.

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

目标 XML:

<Order>
 <OrderItem>
   <Item>
      <Item>1</Item>
      <Qty>10</Qty>
   </Item>
   <Item>
      <Item>2</Item>
      <Qty>20</Qty>
   </Item>
 </OrderItem>
</Order>

XSLT:

<xsl:template match="@*|node()">
<Order>
    <xsl:for-each select="Detail">
        <Item>
            <xsl:apply-templates select="Record[position()>1]"/>
        </Item>
</xsl:for-each>
</Order>
</xsl:template>

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

推荐答案

分组方式如下:

<?xml version="1.0" encoding="UTF-8"?>
<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">
        <Order>
            <xsl:for-each-group select="Detail" group-by="Record[1]/FieldValue">
                <xsl:element name="{current-grouping-key()}">
                    <xsl:apply-templates select="current-group()"/>
                </xsl:element>
            </xsl:for-each-group>
        </Order>
    </xsl:template>

    <xsl:template match="Detail">
        <Item>
            <xsl:apply-templates select="Record[position() gt 1]"/>
        </Item>
    </xsl:template>

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

</xsl:stylesheet>

这篇关于XSLT:转换名称/值对并转换 XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆