使用 Python 删除 xslt 中的重复变量声明

Remove duplicate variables declaration in xslt using Python

提问人:RamAlx 提问时间:11/1/2023 最后编辑:mkrieger1RamAlx 更新时间:11/2/2023 访问量:45

问:

假设我有这个 xslt 2.0 代码,它是使用 altova mapforce 生成的

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template name="SDEV:SDEV_NCTS_down_fillUCRC547"/>
        <xsl:for-each select="($var292_CD___C)]">
            <AL586B xmlns="AL586B" >
                <xsl:variable name="var288_cur" as="node()" select="."/>
                <xsl:variable name="var287___as_double" as="xs:double" select="xs:double('6')"/>
            </AL586B>
        </xsl:for-each>
        <xsl:for-each select="(./ns0:AL586B)">
            <AL506C xmlns="AL506C">
                <xsl:attribute name="xsi:schemaLocation" namespace="http://www.w3.org/2001/XMLSchema-instance"/>
                <xsl:variable name="var287___as_double" as="xs:double" select="xs:double('6')"/>
                <xsl:variable name="var1_preparationDateAndTi_as_string" as="xs:string" select="xs:string(xs:dateTime(fn:string($var287___as_double)))"/>
            </AL506C>
        </xsl:for-each>
</xsl:stylesheet>

如您所见,变量名称已声明两次,这会导致问题。如何使用 Python 读取此 xslt 并在我发现的每个重复值中将其重命名为类似 ?var287___as_doublevar287___as_double2

当然,每当使用这个重复的 var 时,使用新声明的 var?

例如,新的 xslt 将如下所示:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template name="SDEV:SDEV_NCTS_down_fillUCRC547"/>
        <xsl:for-each select="($var292_CD___C)]">
            <AL586B xmlns="AL586B" >
                <xsl:variable name="var288_cur" as="node()" select="."/>
                <xsl:variable name="var287___as_double" as="xs:double" select="xs:double('6')"/>
            </AL586B>
        </xsl:for-each>
        <xsl:for-each select="(./ns0:AL586B)">
            <AL506C xmlns="AL506C">
                <xsl:attribute name="xsi:schemaLocation" namespace="http://www.w3.org/2001/XMLSchema-instance"/>
                <xsl:variable name="var287___as_double2" as="xs:double" select="xs:double('6')"/>
                <xsl:variable name="var1_preparationDateAndTi_as_string" as="xs:string" select="xs:string(xs:dateTime(fn:string($var287___as_double2)))"/>
            </AL506C>
        </xsl:for-each>
</xsl:stylesheet>

另一种解决方案是在 AL506C 标签之后进行检查并重命名其下的每个变量。

python xml xslt-2.0

评论

0赞 leaf_yakitori 11/1/2023
只需搜索以“xsl:variable name=”开头的字符串,将其保存到字典中即可。
0赞 RamAlx 11/1/2023
@leaf_yakitori奇怪的是变量引用
0赞 leaf_yakitori 11/1/2023
你需要展示你尝试过的东西。

答:

1赞 Michael Kay 11/1/2023 #1

首先,转换 XSLT 的明显语言是 XSLT,而不是 Python。

那里有一些非常奇怪的 XSLT 代码,因为变量是声明的,但从未被引用过。

当然,在 XSLT 中拥有两个同名变量是完全合法的,尤其是当它们的范围不重叠时(如此处所示)。

重命名变量并不困难,困难的部分是重命名对变量的任何引用。为此,您需要了解变量引用的作用域规则,以便可以确定每个引用指向哪个变量。如果范围重叠,这将变得尤为困难。在这一点上,决定变成了,你希望你的解决方案有多普遍?它是否必须处理所有边缘情况?或者你可以走捷径,比如假设变量引用引用最近声明的具有匹配名称的变量?

正确的解决方案需要完全解析样式表中的每个 XPath 表达式,因此非常具有挑战性。大多数时候有效的黑客可能更容易。因此,在这一点上,我们需要更多地了解这个项目:你到底想实现什么?例如,为什么重复的变量名实际上是一个问题?