使用XSLT添加XML属性

时间:2015-03-28 00:29:23

标签: xml xslt

我目前正在使用XSLT从XML文档中提取值并创建新的XML文档。我的部分XSLT如下:

<xsl:element name="urn:sObjects">
    <xsl:element name="urn1:type">
          <xsl:value-of select="/ProcessData/Create/type"/>
    </xsl:element>
    <xsl:element name="CreatedDate">
          <xsl:value-of select="Create/CreatedDate"/>
    </xsl:element>
    <xsl:element name="Alert_Code__c">
          <xsl:value-of select="Create/AlertCode"/>
    </xsl:element>
    <xsl:element name="Status__c">
          <xsl:value-of select="Create/Status"/>
    </xsl:element>
    <xsl:element name="Name">
          <xsl:value-of select="Create/Name"/>
    </xsl:element>
    <xsl:element name="Order_Id__c">
          <xsl:value-of select="Create/OrderID"/>
    </xsl:element>
</xsl:element>

目前,此输出:

<urn:sObjects>
  <urn1:type xmlns:urn1="urn:sobject.enterprise.soap.sforce.com">O2C_SAP_Service_Alert__c</urn1:type>
  <CreatedDate />
  <Alert_Code__c>ZD</Alert_Code__c>
  <Status__c>new</Status__c>
  <Name />
  <Order_Id__c>0000000102</Order_Id__c>
</urn:sObjects>

我希望输出的是:

<urn:sObjects xsi:type="urn1:O2C_Alert__c">
  <urn1:type xmlns:urn1="urn:sobject.enterprise.soap.sforce.com">O2C_SAP_Service_Alert__c</urn1:type>
  <CreatedDate />
  <Alert_Code__c>ZD</Alert_Code__c>
  <Status__c>new</Status__c>
  <Name />
  <Order_Id__c>0000000102</Order_Id__c>
</urn:sObjects>

换句话说,我想将属性xsi:type="urn1:O2C_Alert__c"添加到此XML消息中。

我怎么能这样做,使用XSLT?

1 个答案:

答案 0 :(得分:3)

您无需使用xsl:element来创建元素。 您可以将其简化为以下内容(确保为xsi前缀声明了一个名称空间):

<urn:sObjects xsi:type="urn1:O2C_Alert__c">
    <urn1:type>
        <xsl:value-of select="/ProcessData/Create/type"/>
    </urn1:type>
</urn:sObjects>

修改 要使属性值动态化,可以使用{}评估xpath,如下所示:

<urn:sObjects xsi:type="{a/b/c}">

或者,您可以使用:

<urn:sObjects>
    <xsl:attribute name="xsi:type">
        <xsl:value-of select="a/b/c"/>
    </xsl:attribute>
    <!-- followed by other attributes, and then by elements -->
</urn:sObjects>

确保在任何子元素之前声明所有xsl:attribute