提问人:RamAlx 提问时间:11/1/2023 最后编辑:mkrieger1RamAlx 更新时间:11/2/2023 访问量:45
使用 Python 删除 xslt 中的重复变量声明
Remove duplicate variables declaration in xslt using Python
问:
假设我有这个 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_double
var287___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 标签之后进行检查并重命名其下的每个变量。
答:
1赞
Michael Kay
11/1/2023
#1
首先,转换 XSLT 的明显语言是 XSLT,而不是 Python。
那里有一些非常奇怪的 XSLT 代码,因为变量是声明的,但从未被引用过。
当然,在 XSLT 中拥有两个同名变量是完全合法的,尤其是当它们的范围不重叠时(如此处所示)。
重命名变量并不困难,困难的部分是重命名对变量的任何引用。为此,您需要了解变量引用的作用域规则,以便可以确定每个引用指向哪个变量。如果范围重叠,这将变得尤为困难。在这一点上,决定变成了,你希望你的解决方案有多普遍?它是否必须处理所有边缘情况?或者你可以走捷径,比如假设变量引用引用最近声明的具有匹配名称的变量?
正确的解决方案需要完全解析样式表中的每个 XPath 表达式,因此非常具有挑战性。大多数时候有效的黑客可能更容易。因此,在这一点上,我们需要更多地了解这个项目:你到底想实现什么?例如,为什么重复的变量名实际上是一个问题?
下一个:使用子节点的 XSLT 分组
评论