首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用时的XSLT副本

使用时的XSLT副本
EN

Stack Overflow用户
提问于 2015-04-08 13:23:21
回答 1查看 1.1K关注 0票数 0

我正在使用XSLT尝试格式化一个webservice调用。我能够将"Header“元素复制到已翻译的文档中,但是我无法复制行项目字段。我使用的是for-每个命令,但是它不循环数据。

我要传递的XML如下所示:

代码语言:javascript
复制
<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是:

代码语言:javascript
复制
<?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>

我得到的输出在下面。

代码语言:javascript
复制
<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“元素以及它的子元素。我想看到的是:

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-08 13:41:44

你的问题就在这里

代码语言:javascript
复制
<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>

您可以使用正确的上下文来修复它。

代码语言:javascript
复制
<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>

但是, --我建议您不要对此问题使用<xsl:for-each>

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

代码语言:javascript
复制
<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>

给你

代码语言:javascript
复制
<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>

基于“身份模板”的方法给出了

  • 增加模块性
  • 增加可重用性
  • 少筑巢
  • 更好的可扩展性(需要修改节点吗?)只为这种情况添加一个模板。需要从输出中完全删除节点吗?添加一个空模板,如这个:<xsl:template match="free_msg_text__c" />完成。)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29515917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档