使用 XSLT 进行空前缀转换的 XML [重复]

Posted

技术标签:

【中文标题】使用 XSLT 进行空前缀转换的 XML [重复]【英文标题】:XML with empty prefix transformation with XSLT [duplicate] 【发布时间】:2021-09-19 17:35:27 【问题描述】:

我愿意使用XSLT 通过删除 (TextLine) 元素将 XML 文件转换为其他 XML 文件。但是,在输出 XML 文件中,元素并没有像我期望的那样被删除。我想我必须修改 XSLT 文件,但我不知道如何修改。让我知道应该怎么做。

我怀疑问题的根本原因是 XML 文件中的元素有一个空的前缀命名空间。

详情如下。

包含空前缀命名空间元素的 XML test-01.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<alto xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://www.loc.gov/standards/alto/ns-v4#"
      xsi:schemaLocation="http://www.loc.gov/standards/alto/ns-v4# http://www.loc.gov/standards/alto/v4/alto-4-2.xsd">
    <TextLine TAGREFS="LT9"/>
    <TextLine TAGREFS="LT10"/>
    <TextLine TAGREFS="LT9"/>
    <TextLine TAGREFS="LT8"/>
</alto>

我正在使用以下date.xslt 文件:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="TextLine"/>

</xsl:stylesheet>

注意:我使用 python lxml 来执行转换。但是,这应该不会对流程产生任何影响,因为我可以使用任何其他 XML 转换器作为 xsltproc

【问题讨论】:

【参考方案1】:

是的。您认为默认名称空间是 XSLT 无法按预期运行的原因的假设是正确的。试试这个 XSLT-1.0:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:loc="http://www.loc.gov/standards/alto/ns-v4#">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="loc:TextLine"/>

</xsl:stylesheet>

【讨论】:

以上是关于使用 XSLT 进行空前缀转换的 XML [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用XSLT将XML转换为csv

XML 文件中的 XML 模式声明破坏了 XSLT 转换 [重复]

XSLT 3.0 - 在 XSLT 3.0 xml-to-json() 中出现错误“重复键值”

需要 XSLT 转换以删除重复元素 - 按属性排序

xslt 中的 XML 命名空间处理

将 xml 中的节点与 xslt 进行比较