gpt4 book ai didi

python - XLST 标签在不同处理器中的应用不一致

转载 作者:太空宇宙 更新时间:2023-11-03 18:44:13 24 4
gpt4 key购买 nike

编辑:

这是我能想到的 lxml 中最小的测试用例(完全用 Python 编写)

from lxml import etree

xslt_tree = etree.XML('''\
<?xml version="1.0" encoding="UTF-8"?>
<MD_Metadata xmlns="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco">
<language/>
<characterSet/>
</MD_Metadata>''')

doc = etree.XML('''\
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:gmd="http://www.isotc211.org/2005/gmd" >

<!-- This adds the contact tag if it doesn't exist -->
<xsl:template match="/gmd:MD_Metadata">
<xsl:copy-of select="*"/>
<xsl:message>
Worked
</xsl:message>
</xsl:template>
</xsl:stylesheet>''')

transform = etree.XSLT(doc)

result = transform(xslt_tree)
print transform.error_log
print (etree.tostring(result,pretty_print=True))

此输出

<language xmlns="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco"/>

什么时候应该输出

<MD_Metadata xmlns="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco">
<language/>
<characterSet/>
</MD_Metadata>

有什么想法吗?

<小时/>

老问题

我有一个像这样的 xml 文件:

    <?xml version="1.0" encoding="UTF-8"?>
<MD_Metadata xmlns="http://www.isotc211.org/2005/gmd">
<language>
<LanguageCode codeList="http://www.loc.gov/standards/iso639-2/php/code_list.php" codeListValue="eng" codeSpace="ISO639-2">eng</LanguageCode>
</language>
<characterSet>
<MD_CharacterSetCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_CharacterSetCode" codeListValue="utf8" codeSpace="ISOTC211/19115">utf8</MD_CharacterSetCode>
</characterSet>
.... etc
</MD_Metadata>

和一个 xlt 文件如下:

 <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!-- Show all elements -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<!-- This adds the contact tag if it doesn't exist -->
<xsl:template match="/gmd:MD_Metadata">
<xsl:copy-of select="@*|node()">
<xsl:if test="not(/gmd:MD_Metadata/gmd:contact)">
<xsl:element name="contact" namespace="http://www.isotc211.org/2005/gmd">
</xsl:element>
</xsl:if>
</xsl:copy-of>
</xsl:template>

</xsl:stylesheet>

当我在 Python 中的 lxml 中运行它时,我得到了 MD_Metadata 元素和返回的第一个子元素。但是,当我使用默认 Java 处理器或 Xalan 在 Eclipse WTP(Eclipse XSL 工具)中运行此程序时,我得到了从 MD_Metadata 标记返回的所有元素,包括字符集和之后的元素。对我来说,后者是标签的预期行为。我看不到在 Python 中调用转换时所做的任何事情,但以防万一:

xslt_root = lxml.etree.parse("XSLFile")
transform = lxml.etree.XSLT(xslt_root)
result_tree = transform(doc)
print (etree.tostring(result_tree,pretty_print=True))

我使用的两个处理器之间是否存在实质性差异,或者是否有其他解释?

最佳答案

您出现奇怪行为的原因是 xsl:copy-of should be an empty element 。我只能假设某些引擎“有帮助”地尝试以某种未定义的方式解释 xsl:if ,从而导致了麻烦。

删除导致未定义行为的元素,它应该在不同引擎之间再次保持一致。

关于python - <copy-of> XLST 标签在不同处理器中的应用不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19915933/

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