xml - 输入 xml 文件已定义或不存在 xmlns 的 XSL 转换

标签 xml xslt xslt-1.0

我有一个 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/

相关文章:

xml - XSL 和 XSLT 之间有什么关系

java - 第一次使用 JAXB 将 XML 映射到 Java 类 — 需要一些构建帮助

Java 读取 Maven 项目中的 XML 文件 - Openshift JBoss

XSLT 将节点文本包裹在子节点值周围

xml - 将元素值连接到一行

XSLT:将 URL 查询字符串作为参数传递

python - 将 xml 转换为 python 字典

xml - 运行测试用例时出现 NoSuchMethodError 错误

xml - 使用XSLT选择另一个节点中不存在的所有元素

javascript - 在下拉列表中实现垂直滚动条