【问题标题】:XSLT Transformation based on predefined output string基于预定义输出字符串的 XSLT 转换
【发布时间】:2012-05-12 18:06:49
【问题描述】:

我需要 xslt 来转换,我的 Xml 如下

 <OrderReferences>
            <OrderRef>
              <OrderRef>OrderRef1</OrderRef>
              <Type>ERP</Type>
            </OrderRef>
            <OrderRef>
              <OrderRef>OrderRef2</OrderRef>
              <Type>CUSTOMER</Type>
            </OrderRef>
            <OrderRef>
              <OrderRef>OrderRef3</OrderRef>
              <Type>EXT</Type>
            </OrderRef>
          </OrderReferences>

我的输出应该是

<OrderReference> (OrderReference for ERP should appear here) </OrderReference>
<OrderReferenceCustomer> (CustomerReference for Customer should appear here) </OrderReferenceCustomer>
<OrderReferenceExternal> (ExtReference for EXT should appear here) </OrderReferenceExternal>

让我知道这是否可以实现。 XSLT 1.0 版本更可取,因为我希望它用于 .Net。谢谢。

【问题讨论】:

  • 在原始 XML 中的哪个位置有 CustomerReferenceErpOrderReference
  • ErpOrderReference、ErpCustomerReference、ErpExtReference 是我要将这些数据放入的对象。我需要一个像这样的xslt。
  • 嗯,正确的答案是“是的,这是可以实现的”。您不认为您应该自己尝试一下,如果遇到特定问题再回来?

标签: xml xslt-1.0 xslt-grouping xslt


【解决方案1】:

您需要利用 xsl:element 根据 Type 元素创建新的元素名称。试试这个 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="OrderRef">
      <xsl:element name="Erp{substring(Type, 1, 1)}{translate(substring(Type, 2, string-length(Type) - 1), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')}Reference">
         <xsl:value-of select="OrderRef" />
      </xsl:element>
   </xsl:template>

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

当它应用于您的示例 XML 时,将输出以下内容

<OrderReferences>
   <ErpErpReference>OrderRef1</ErpErpReference>
   <ErpCustomerReference>OrderRef2</ErpCustomerReference>
   <ErpExtReference>OrderRef3</ErpExtReference>
</OrderReferences>

这应该可以处理包含任何值的 Type 元素。

【讨论】:

  • 我需要 xslt 用于版本“1.0”,因为 .net 不支持小写等功能。
  • 我已将其更改为 XSLT 1.0。
  • 感谢蒂姆的意见,真的很有帮助。
  • 这是结果。感谢大家的投入。
【解决方案2】:

这个简短而简单的转换

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

 <xsl:template match="OrderRef[Type='ERP']">
     <OrderReference><xsl:value-of select="OrderRef"/></OrderReference>
 </xsl:template>

 <xsl:template match="OrderRef[Type='CUSTOMER']">
     <OrderReferenceCustomer><xsl:value-of select="OrderRef"/></OrderReferenceCustomer>
 </xsl:template>

 <xsl:template match="OrderRef[Type='EXT']">
     <OrderReferenceExternal><xsl:value-of select="OrderRef"/></OrderReferenceExternal>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时

<OrderReferences>
    <OrderRef>
        <OrderRef>OrderRef1</OrderRef>
        <Type>ERP</Type>
    </OrderRef>
    <OrderRef>
        <OrderRef>OrderRef2</OrderRef>
        <Type>CUSTOMER</Type>
    </OrderRef>
    <OrderRef>
        <OrderRef>OrderRef3</OrderRef>
        <Type>EXT</Type>
    </OrderRef>
</OrderReferences>

产生确切想要的正确结果(与当前接受的答案不同):

<OrderReference>OrderRef1</OrderReference>
<OrderReferenceCustomer>OrderRef2</OrderReferenceCustomer>
<OrderReferenceExternal>OrderRef3</OrderReferenceExternal>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    相关资源
    最近更新 更多