【问题标题】:XSLT: Need to convert name value pair content into XMLXSLT:需要将名称值对内容转换为 XML
【发布时间】:2017-09-29 16:00:32
【问题描述】:

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

要生成的目标 XML:

<SC>
    <OrderHeader>
        <Order>1234</Order>
    </OrderHeader>
    <OrderItem>
        <Item>1</Item>
        <Qty>10</Qty>
    </OrderItem>
    <OrderItem>
        <Item>2</Item>
        <Qty>20</Qty>
    </OrderItem>
</SC>

我尝试过的 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>

【问题讨论】:

    标签: xslt-1.0 xslt-2.0


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您似乎想将第一个 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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-21
        • 1970-01-01
        • 2011-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-30
        • 1970-01-01
        相关资源
        最近更新 更多