【问题标题】:XSLT Copy When Using For-Each使用 For-Each 时的 XSLT 复制
【发布时间】:2015-04-08 23:36:29
【问题描述】:

我正在使用 XSLT 来尝试格式化 Web 服务调用。我可以将“标题”元素复制到翻译后的文档中,但是我无法复制行项目字段。我正在使用 for-each 命令,但它不会循环遍历数据。

我传入的 XML 如下所示:

<OTC_Alerts_KNA>
   <Header>
      <current_date_time_of_application_server__c>2015-04-08T12:48:50</current_date_time_of_application_server__c>
      <alert_type__c>LSH</alert_type__c>
      <single_character_indicator__c>O</single_character_indicator__c>
      <alert_functional_area__c>DELV</alert_functional_area__c>
      <customer_number__c>1000000118</customer_number__c>
      <customer_name__c>WEBCO HAWAII</customer_name__c>
      <sales_document_number__c>0000012164</sales_document_number__c>
      <sales_document_type__c>ZOR</sales_document_type__c>
   </Header>
   <Line_Items>
      <customer_purchase_order_number__c>LDSHORTAGE11</customer_purchase_order_number__c>
      <requested_delivery_date__c>2015-04-01</requested_delivery_date__c>
      <material_number__c>000000000100100010</material_number__c>
      <short_text_for_sales_order_item__c>SPK RED BRY 12 oz1</short_text_for_sales_order_item__c>
      <free_msg_text__c>000010</free_msg_text__c>
      <confirmed_quantity__c>10</confirmed_quantity__c>
      <pick_quantity__c>10</pick_quantity__c>
   </Line_Items>
   <Line_Items>
      <customer_purchase_order_number__c>LDSHORTAGE11</customer_purchase_order_number__c>
      <requested_delivery_date__c>2015-04-01</requested_delivery_date__c>
      <material_number__c>000000000100100003</material_number__c>
      <short_text_for_sales_order_item__c>RICE KRPS 12CT/CS</short_text_for_sales_order_item__c>
      <free_msg_text__c>000020</free_msg_text__c>
      <confirmed_quantity__c>10</confirmed_quantity__c>
      <pick_quantity__c>10</pick_quantity__c>
   </Line_Items>
</OTC_Alerts_KNA>

我的 XSLT 是:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:urn="urn:enterprise.soap.sforce.com" xmlns:urn1="urn:sobject.enterprise.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
   <xsl:template match="*">
    <xsl:element name="urn:create">
        <urn:sObjects xsi:type="urn1:iDoc__c">
            <xsl:copy-of select="OTC_Alerts_KNA/Header/node()" />
        </urn:sObjects>
        <xsl:for-each select="OTC_Alerts_KNA/Line_Items">
            <urn:sObjects xsi:type="urn1:iDoc_Line_Item__c">
<xsl:copy-of select="OTC_Alerts_KNA/Line_Items/node()" />
            </urn:sObjects>
        </xsl:for-each>
    </xsl:element>
   </xsl:template>
</xsl:stylesheet>

我得到的输出如下。

<urn:create
    xmlns:urn="urn:enterprise.soap.sforce.com">
    <urn:sObjects
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:urn1="urn:sobject.enterprise.soap.sforce.com" xsi:type="urn1:iDoc__c">
        <current_date_time_of_application_server__c>2015-04-08T12:48:50</current_date_time_of_application_server__c>
        <alert_type__c>LSH</alert_type__c>
        <single_character_indicator__c>O</single_character_indicator__c>
        <alert_functional_area__c>DELV</alert_functional_area__c>
        <customer_number__c>1000000118</customer_number__c>
        <customer_name__c>WEBCO HAWAII</customer_name__c>
        <sales_document_number__c>0000012164</sales_document_number__c>
        <sales_document_type__c>ZOR</sales_document_type__c>
    </urn:sObjects>
    <urn:sObjects
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:urn1="urn:sobject.enterprise.soap.sforce.com" xsi:type="urn1:iDoc_Line_Item__c"/>
    <urn:sObjects
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:urn1="urn:sobject.enterprise.soap.sforce.com" xsi:type="urn1:iDoc_Line_Item__c"/>
</urn:create>

如您所见,“OTC_Alerts_KNA/Header”节点被复制,但行项目未被复制。我希望复制每个“Line_Item”元素及其子元素。我想看到的是:

<urn:create xmlns:urn="urn:enterprise.soap.sforce.com">
   <urn:sObjects xmlns:urn1="urn:sobject.enterprise.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="urn1:iDoc__c">
      <current_date_time_of_application_server__c>2015-04-08T12:48:50</current_date_time_of_application_server__c>
      <alert_type__c>LSH</alert_type__c>
      <single_character_indicator__c>O</single_character_indicator__c>
      <alert_functional_area__c>DELV</alert_functional_area__c>
      <customer_number__c>1000000118</customer_number__c>
      <customer_name__c>WEBCO HAWAII</customer_name__c>
      <sales_document_number__c>0000012164</sales_document_number__c>
      <sales_document_type__c>ZOR</sales_document_type__c>
   </urn:sObjects>
   <urn:sObjects xmlns:urn1="urn:sobject.enterprise.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="urn1:iDoc_Line_Item__c">
      <customer_purchase_order_number__c>LDSHORTAGE11</customer_purchase_order_number__c>
      <requested_delivery_date__c>2015-04-01</requested_delivery_date__c>
      <material_number__c>000000000100100010</material_number__c>
      <short_text_for_sales_order_item__c>SPK RED BRY 12 oz1</short_text_for_sales_order_item__c>
      <free_msg_text__c>000010</free_msg_text__c>
      <confirmed_quantity__c>10</confirmed_quantity__c>
      <pick_quantity__c>10</pick_quantity__c>
   </urn:sObjects>
   <urn:sObjects xmlns:urn1="urn:sobject.enterprise.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="urn1:iDoc_Line_Item__c">
      <customer_purchase_order_number__c>LDSHORTAGE11</customer_purchase_order_number__c>
      <requested_delivery_date__c>2015-04-01</requested_delivery_date__c>
      <material_number__c>000000000100100003</material_number__c>
      <short_text_for_sales_order_item__c>RICE KRPS 12CT/CS</short_text_for_sales_order_item__c>
      <free_msg_text__c>000020</free_msg_text__c>
      <confirmed_quantity__c>10</confirmed_quantity__c>
      <pick_quantity__c>10</pick_quantity__c>
   </urn:sObjects>
</urn:create>

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    你的问题来了

    <xsl:for-each select="OTC_Alerts_KNA/Line_Items">
        <!-- context is now at the <Line_Items> node! -->
        <urn:sObjects xsi:type="urn1:iDoc_Line_Item__c">
            <!-- there is no <OTC_Alerts_KNA> beneath <Line_Items> -->
            <xsl:copy-of select="OTC_Alerts_KNA/Line_Items/node()" />
        </urn:sObjects>
    </xsl:for-each>
    

    可以通过使用正确的上下文来修复它

    <xsl:for-each select="OTC_Alerts_KNA/Line_Items">
        <urn:sObjects xsi:type="urn1:iDoc_Line_Item__c">
            <xsl:copy-of select="node()" />
        </urn:sObjects>
    </xsl:for-each>
    

    但是,我建议您不要使用 &lt;xsl:for-each&gt; 来解决此问题。

    使用基于身份模板的转换和几个专门处理一个案例的模板:

    <xsl:transform
      version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:urn="urn:enterprise.soap.sforce.com"
      xmlns:urn1="urn:sobject.enterprise.soap.sforce.com" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    >
      <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    
      <xsl:template match="@*|node()">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:template>
    
      <xsl:template match="OTC_Alerts_KNA">
        <urn:create>
          <xsl:apply-templates select="*"/>
        </urn:create>
      </xsl:template>  
    
      <xsl:template match="Header">
        <urn:sObjects xsi:type="urn1:iDoc__c">
          <xsl:apply-templates select="*"/>
        </urn:sObjects>
      </xsl:template>
    
      <xsl:template match="Line_Items">
        <urn:sObjects xsi:type="urn1:iDoc_Line_Item__c">
          <xsl:apply-templates select="*"/>
        </urn:sObjects>
      </xsl:template>
    </xsl:transform>
    

    给你

    <urn:create xmlns:urn="urn:enterprise.soap.sforce.com"
                xmlns:urn1="urn:sobject.enterprise.soap.sforce.com"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <urn:sObjects xsi:type="urn1:iDoc__c">
          <current_date_time_of_application_server__c>2015-04-08T12:48:50</current_date_time_of_application_server__c>
          <alert_type__c>LSH</alert_type__c>
          <single_character_indicator__c>O</single_character_indicator__c>
          <alert_functional_area__c>DELV</alert_functional_area__c>
          <customer_number__c>1000000118</customer_number__c>
          <customer_name__c>WEBCO HAWAII</customer_name__c>
          <sales_document_number__c>0000012164</sales_document_number__c>
          <sales_document_type__c>ZOR</sales_document_type__c>
       </urn:sObjects>
       <urn:sObjects xsi:type="urn1:iDoc_Line_Item__c">
          <customer_purchase_order_number__c>LDSHORTAGE11</customer_purchase_order_number__c>
          <requested_delivery_date__c>2015-04-01</requested_delivery_date__c>
          <material_number__c>000000000100100010</material_number__c>
          <short_text_for_sales_order_item__c>SPK RED BRY 12 oz1</short_text_for_sales_order_item__c>
          <free_msg_text__c>000010</free_msg_text__c>
          <confirmed_quantity__c>10</confirmed_quantity__c>
          <pick_quantity__c>10</pick_quantity__c>
       </urn:sObjects>
       <urn:sObjects xsi:type="urn1:iDoc_Line_Item__c">
          <customer_purchase_order_number__c>LDSHORTAGE11</customer_purchase_order_number__c>
          <requested_delivery_date__c>2015-04-01</requested_delivery_date__c>
          <material_number__c>000000000100100003</material_number__c>
          <short_text_for_sales_order_item__c>RICE KRPS 12CT/CS</short_text_for_sales_order_item__c>
          <free_msg_text__c>000020</free_msg_text__c>
          <confirmed_quantity__c>10</confirmed_quantity__c>
          <pick_quantity__c>10</pick_quantity__c>
       </urn:sObjects>
    </urn:create>
    

    基于“身份模板”的方法为您提供

    • 增加模块化
    • 提高了可重用性
    • 少嵌套
    • 更好的可扩展性(需要修改节点?仅针对这种情况添加一个模板。需要从输出中完全删除一个节点?添加一个像这样的空模板:&lt;xsl:template match="free_msg_text__c" /&gt; - 完成。)

    【讨论】:

    • 我无法要求得到更好的回应。我已使用您建议的模板,一切似乎都正常工作。
    猜你喜欢
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    相关资源
    最近更新 更多