我有一个 xml 输入,有时可能已定义或未定义 xmlns。 如何仅用一个 xsl 来解决这种情况并成功转换? 以下是两种情况下的输入以及 xsl (1.0)
输入文件:
<?xml version="1.0" encoding="UTF-8"?>
<input version="2.1">
<Data>
<Object class="PM" operation="create" name="japan">
<p name="Active">1</p>
</Object>
<Object class="AM" operation="create" name="india">
<p name="Active">0</p>
</Object>
</Data>
</input>
没有命名空间定义的 XSL:
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="Data">
<xsl:copy>
<xsl:apply-templates select="Object[@class='PM' or @class='AM']">
<xsl:sort select="@name"/>
</xsl:apply-templates>
<xsl:apply-templates select="Object[not(@class='PM' or @class='AM')]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Object[@operation = 'create' ]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="class">
<xsl:value-of select="concat(@class,'/TIME')"/>
</xsl:attribute>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
输入定义了命名空间的 xml:
<?xml version="1.0" encoding="UTF-8"?>
<input version="2.1" xmlns="xyz.xsd">
<Data>
<Object class="PM" operation="create" name="japan">
<p name="Active">1</p>
</Object>
<Object class="AM" operation="create" name="india">
<p name="Active">0</p>
</Object>
</Data>
</input>
尽管 xslt 不会抛出错误,但输出并未按预期进行转换:(
如何使用单个 xsl 处理上述情况,或者欢迎任何想法。
最佳答案
如果您需要处理具有特定本地名称的任何元素,而不管 XSLT 1.0 中的命名空间如何,那么您需要使用像 *[local-name() = 'Object']
这样的习惯用法,或者或者,您可以将模式基于结构而不是名称(即,您不是“匹配名为 Object 的元素”,而是说“匹配从根向下三层的任何元素”):
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/*/*">
<xsl:copy>
<xsl:apply-templates select="*[@class='PM' or @class='AM']">
<xsl:sort select="@name"/>
</xsl:apply-templates>
<xsl:apply-templates select="*[not(@class='PM' or @class='AM')]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*/*/*[@operation = 'create' ]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="class">
<xsl:value-of select="concat(@class,'/TIME')"/>
</xsl:attribute>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
关于xml - 输入 xml 文件已定义或不存在 xmlns 的 XSL 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21192955/