我有来自客户的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命名空间的情况下进行此类替换? 提前谢谢。
答案 0 :(得分:0)
这可以通过使用 name()和 namespace-uri()函数来实现。
<xsl:attribute name="{name()}" namespace="{namespace-uri()}">VM Network</xsl:attribute>
在XSLT中使用此行时,您应该获得所需的输出
<Network ovf:name="VM network"/>
答案 1 :(得分:0)
我遇到这个问题的首选方法是双程解决方案:首先规范化名称空间,然后进行“真正的”处理。这样做的好处是管道中的规范化步骤可以重复使用,无论您想要进行的后续处理如何,它将始终使后续处理更容易。