使用XSLT将属性值替换为未知命名空间

时间:2011-08-02 13:22:58

标签: xslt xslt-1.0

我有来自客户的XML,我无法确定命名空间。我需要替换某些属性的值。这是输入XML示例:

<?xml version="1.0" encoding="UTF-8"?>
<NetworkSection xmlns:ovf="http://com/deployment/1.0">
    <Network ovf:name="bridged"/>
</NetworkSection>

我希望收到这样的XML:

<?xml version="1.0" encoding="UTF-8"?>
<NetworkSection xmlns:ovf="http://com/deployment/1.0">
    <Network ovf:name="VM network"/>
</NetworkSection>

这是我尝试使用的XSL:

<?xml version="1.0" encoding="utf-8"?>
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="utf-8"/>
  <xsl:template match="NetworkSection/Network/@*[local-name()='name']">
    <xsl:attribute name='name'>VM Network</xsl:attribute>
  </xsl:template>

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

问题是我丢失了属性命名空间。 我无法在我的XSL中定义命名空间,因为它可能在不同的输入XML中有所不同,我只想更改属性值。

是否可以在不指定XSL命名空间的情况下进行此类替换? 提前谢谢。

2 个答案:

答案 0 :(得分:0)

这可以通过使用 name() namespace-uri()函数来实现。

<xsl:attribute name="{name()}" namespace="{namespace-uri()}">VM Network</xsl:attribute>

在XSLT中使用此行时,您应该获得所需的输出

<Network ovf:name="VM network"/> 

答案 1 :(得分:0)

我遇到这个问题的首选方法是双程解决方案:首先规范化名称空间,然后进行“真正的”处理。这样做的好处是管道中的规范化步骤可以重复使用,无论您想要进行的后续处理如何,它将始终使后续处理更容易。