gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:57:12 29 4
gpt4 key购买 nike

我有一个 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 中的 namespace 如何,那么您需要使用像 *[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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com