0

我有这个 xslt 样式表:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/REC-html40"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"

>
  <xsl:output method="xml" omit-xml-declaration="yes" standalone="yes"  />
  <xsl:template match="/" >
    <Parameters>
      <xsl:apply-templates/>
    </Parameters>
  </xsl:template>

  <xsl:template match="PrimitiveParameter">

    <!-- String -->
    <xsl:if test="Value/@xsi:type='xsd:string'">
      <xsl:element name="StringParameter">
       <xsl:attribute name="name">
          <xsl:value-of select="Name" />
        </xsl:attribute>

        <xsl:if test="Key">
          <xsl:attribute name="DomainKey">
            <xsl:value-of select="Key" />
          </xsl:attribute>
        </xsl:if>
        <xsl:value-of select="Value" />
      </xsl:element>
    </xsl:if>

    <!-- DateTime -->
    <xsl:if test="Value/@xsi:type='xsd:dateTime'">
      <xsl:element name="DateParameter">
        <xsl:attribute name="name">
          <xsl:value-of select="Name" />
        </xsl:attribute>
        <xsl:value-of select="Value" />
      </xsl:element>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

它产生这个 XML:

<Parameters xmlns="http://www.w3.org/TR/REC-html40" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">   
    <StringParameter name="field" DomainKey="Domaine">TNA</StringParameter>
    <DateParameter name="date">2011-12-14T00:00:00</DateParameter>
</Parameters>

我想删除 XML 命名空间声明:

<Parameters>   
  <StringParameter name="field" DomainKey="Domaine">TNA</StringParameter>
  <DateParameter name="date">2011-12-14T00:00:00</DateParameter>
</Parameters>

可能吗 ?

问候,

弗洛里安

4

1 回答 1

2

在这种情况下,摆脱xmlns="..."应该像删除

xmlns="http://www.w3.org/TR/REC-html40"

从你的xsl:stylesheet开始标签。xsl:element仅指定 a name(没有 a )的文字结果元素和指令namespace受命名空间声明的约束,这些声明在它们出现在样式表 XML 文档中的位置生效。

要摆脱其他未使用的命名空间声明,您需要向xsl:stylesheet

exclude-result-prefixes="xsd xsi"

另一件需要注意的事情是,您的测试Value/@xsi:type='xsd:string'是精确的字符串比较 - 如果源文档使用的前缀不是xsd

<PrimitiveParameter xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <Value xsi:type="xs:string">...</Value>
</PrimitiveParameter>

那么这些将不匹配,即使在语义上 XML 说的是同样的事情。要正确处理此问题,您需要使用模式感知 XSLT 2.0 处理器,例如 Saxon EE,并使用测试element(Value, xsd:string)来测试元素的模式类型而不是其xsi:type属性的文本值。

于 2013-10-09T15:34:16.690 回答