0

我对 XSLT 很陌生,能否请您告诉我用于将以下输入转换为以下输出 XML 的 XSLT 代码?

这是我的输入 XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="tutorials.xsl"?>
<n:Envelope xmlns:n="http://schemas.xmlsoap.org/soap/envelope/">
   <n:Header>
  </n:Header>
   <n:Body xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
      <ns1:sayHello xmlns:ns1="http://webservice_product/helloworld">
         <toWhom>Micky</toWhom>
         <toMe>123</toMe>
         <objAs>
            <id>323232</id>
         </objAs>
      </ns1:sayHello>
   </n:Body>
</n:Envelope>

这是我想要的输出 XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="tutorials.xsl"?>
<n:Envelope xmlns:n="http://schemas.xmlsoap.org/soap/envelope/">
   <n:Header>
  </n:Header>
   <n:Body xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
      <ns1:sayHello xmlns:ns1="http://webservice_product/helloworld" xsi:type="ns698:Product" xmlns:ns698="urn:objects.prodcuts.com">
         <toWhom>Micky</toWhom>
         <toMe>123</toMe>
         <objAs>
            <id>323232</id>
         </objAs>
      </ns1:sayHello>
   </n:Body>
</n:Envelope>

我努力实现所需的输出 XML,但对我没有帮助。此外,堆栈溢出不允许我粘贴所有 XSL 代码。

4

1 回答 1

3

您所需的 XML 输出的名称空间格式不正确,因为该xsi:type属性使用了前缀xsi而没有任何声明。假设您想在ns1:sayHello可以使用的元素上添加该声明

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:n="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:ns1="http://webservice_product/helloworld"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

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

<xsl:template match="ns1:sayHello">
  <ns1:sayHello xsi:type="ns698:Product" xmlns:ns698="urn:objects.prodcuts.com">
    <xsl:apply-templates select="@* | node()"/>
  </ns1:sayHello>
</xsl:template>

</xsl:stylesheet>

当我将带有 Saxon 6.5.5 的样式表应用于输入时

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="tutorials.xsl"?>
<n:Envelope xmlns:n="http://schemas.xmlsoap.org/soap/envelope/">
   <n:Header>
  </n:Header>
   <n:Body xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
      <ns1:sayHello xmlns:ns1="http://webservice_product/helloworld">
         <toWhom>Micky</toWhom>
         <toMe>123</toMe>
         <objAs>
            <id>323232</id>
         </objAs>
      </ns1:sayHello>
   </n:Body>
</n:Envelope>

我得到结果

<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="tutorials.xsl"?><n:Envelope xmlns:n="http://schemas.xmlsoap.org/soap/envelope/">
   <n:Header>
  </n:Header>
   <n:Body xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
      <ns1:sayHello xmlns:ns1="http://webservice_product/helloworld" xmlns:ns698="urn:objects.prodcuts.com" xmlns:xsi="h
ttp://www.w3.org/2001/XMLSchema-instance" xsi:type="ns698:Product">
         <toWhom>Micky</toWhom>
         <toMe>123</toMe>
         <objAs>
            <id>323232</id>
         </objAs>
      </ns1:sayHello>
   </n:Body>
</n:Envelope>
于 2013-06-16T09:15:26.477 回答