XSLT替换属性及其值

时间:2016-05-03 14:56:38

标签: xml xslt

我有这个XML:

<?xml version="1.0" encoding="UTF-8"?>
<ns2:update xmlns:ns2="urn:enterprise.soap.sforce.com">
  <ns2:sObjects type="Account">
    <ns2:Id>001b0000006mKKqAAM</ns2:Id>
    <ns2:Name>NewName</ns2:Name>
  </ns2:sObjects>
</ns2:update>

我希望得到这个输出:

<?xml version="1.0" encoding="UTF-8"?>
<ns2:update xmlns:ns2="urn:enterprise.soap.sforce.com">
  <ns2:sObjects xsi:type="Account" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ns2:Id>001b0000006mKKqAAM</ns2:Id>
    <ns2:Name>NewName</ns2:Name>
  </ns2:sObjects>
</ns2:update>

我需要使用type="Account"元素中的命名空间xsi:type="Account"将属性xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"更改为ns2:sObjects

如何使用XSLT执行此操作?

3 个答案:

答案 0 :(得分:0)

我摆弄了一下,这就是你要找的东西吗?

<xsl:stylesheet version="1.0" xmlns:ns2="urn:enterprise.soap.sforce.com" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    <xsl:template match="/">
        <ns2:update xmlns:ns2="urn:enterprise.soap.sforce.com">
            <ns2:sObjects xsi:type="Account" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <ns2:Id><xsl:value-of select="/ns2:update/ns2:sObjects/ns2:Id"/></ns2:Id>
                <ns2:Name><xsl:value-of select="/ns2:update/ns2:sObjects/ns2:Name"/></ns2:Name>
            </ns2:sObjects></ns2:update>
    </xsl:template>
</xsl:stylesheet>

它更新sObjects的属性并获取子IdName个节点

输出(使用您的输入)

<?xml version="1.0" encoding="UTF-8"?>
<ns2:update xmlns:ns2="urn:enterprise.soap.sforce.com">
    <ns2:sObjects xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Account">
        <ns2:Id>001b0000006mKKqAAM</ns2:Id>
        <ns2:Name>NewName</ns2:Name>
    </ns2:sObjects>
</ns2:update>

答案 1 :(得分:0)

将以下模板添加到身份转换中:

<xsl:template match="@type[. = 'Account']">
  <xsl:attribute name="xsi:type" 
    namespace="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:value-of select="'Account'"/>
  </xsl:attribute>
</xsl:template>

如果术语&#34;身份转换&#34;没有对你说什么,网络搜索引擎应该有所帮助。

答案 2 :(得分:0)

实现这一目标的非常简单的XSLT样式表将是

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns2="urn:enterprise.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xsl:output method="xml" />

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

  <!-- replaces the ns2:sObjects node with the replacement -->
  <xsl:template match="ns2:sObjects">
    <ns2:sObjects xsi:type="{@type}">
      <xsl:apply-templates />
    </ns2:sObjects>
  </xsl:template> 

</xsl:stylesheet>

它的输出是

<?xml version="1.0"?>
<ns2:update xmlns:ns2="urn:enterprise.soap.sforce.com">
  <ns2:sObjects xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Account">
    <ns2:Id>001b0000006mKKqAAM</ns2:Id>
    <ns2:Name>NewName</ns2:Name>
  </ns2:sObjects>
</ns2:update>