XSL 在 XML 转换中创建子元素失败

查理曼

尝试并尝试使以下内容起作用。我有一个类似于的 XML 文件(序列化的 C# 类)

<?xml version="1.0" encoding="utf-8"?>
<MyXml xmlns:xsd="http://www.w3.org/2001/XMLSchema"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Order>
  <Header> 
    <OrderNumber>1234</OrderNumber>
  </Header>
  <Line>
    <Sku>abc</Sku>
    <Qty>300</Qty>
  </Line>
  <Line>
    <Sku>xyz</Sku>
    <Qty>19</Qty>
  </Line>
</Order>

我需要将其转换为:

<?xml version="1.0" encoding="utf-8"?>
<Order Number="1234">
  <Line>
    <Product>abc</Product>
    <Quantity>300</Quantity>
  </Line>
  <Line>
    <Product>xyz</Product>
    <Quantity>19</Quantity>
  </Line>
</Order>

制作 Order 元素的子线。

这是我迄今为止最成功的尝试。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="Header" >
    <Order>
      <xsl:attribute name="Number">
        <xsl:value-of select="OrderNumber"/>
      </xsl:attribute>
      <xsl:apply-templates select="Line"/>    
    </Order>
  </xsl:template>

  <xsl:template  match="Line">
    <Line>
      <Product>
        <xsl:value-of select="Sku" />
      </Product>
      <Quantity>
        <xsl:value-of select="Qty" />
      </Quantity>
    </Line>
  </xsl:template>

</xsl:stylesheet>

这会产生以下具有多个根节点的错误 xml。

<?xml version="1.0" encoding="utf-8"?>
<Order OrderNumber="1234" />
<Line><Product>abc</Product><Quantity>300</Quantity></Line>
<Line><Product>xyz</Product><Quantity>19</Quantity></Line>

显然我遗漏了一些东西,但是经过数小时的尝试,我根本无法将输出 Line 元素设为 Order 的子元素。有人可以指出我正确的方向吗?另外为什么缩进选项似乎只影响输出xml的第一级?

C队

您有一个模板匹配Header,但在此中您<xsl:apply-templates select="Line"/>可以获取Line元素,但Line不是 的子元素Header,因此这不会选择任何内容。

Line由于 XSLT 的内置模板规则,实际上选择了输出中元素你没有一个模板匹配Order,所以XSLT内置的模板使用,这将同时选择HeaderLine下的元素Order

一种解决方案是将模板匹配更改Header为匹配Order

试试这个 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="Order" >
    <Order Number="{Header/OrderNumber}">
      <xsl:apply-templates select="Line"/>    
    </Order>
  </xsl:template>

  <xsl:template  match="Line">
    <Line>
      <Product>
        <xsl:value-of select="Sku" />
      </Product>
      <Quantity>
        <xsl:value-of select="Qty" />
      </Quantity>
    </Line>
  </xsl:template>
</xsl:stylesheet>

请注意使用属性值模板来简化 上的Number属性创建Order

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章