XML 中不需要的新属性 - XSLT 后的输出
Unwanted new attributes in XML-output after XSLT
我想使用 XSLT 转换 XML 文件。在转换过程中,输出文件中添加了一些我无法理解的新属性。
输入XML文件(缩写):
<?xml version="1.0" encoding="UTF-8"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<teiHeader>
<fileDesc>
<titleStmt>
<title/>
</titleStmt>
<publicationStmt>
<publisher/>
</publicationStmt>
<sourceDesc>
<p/>
</sourceDesc>
</fileDesc>
</teiHeader>
<text>
<body>
<pb n="1"/>
<p xml:id="uuid_f770d0a9-277a-42d5-a759-a02b05a29a49">
<lb xml:id="uuid_cf21b2a4-e5b2-4ced-a1b2-a4e5b29ced0a"/>This is
<lb xml:id="uuid_dffd4def-3f7a-4d5b-bd4d-ef3f7abd5bf9"/> <rs type="person">an example</rs>.
</p>
</body>
</text>
</TEI>
用于删除 <lb/>
和 <rs>
之间不需要的空格的 XSLT 样式表(上面输入文件中的第 2 行)与 Saxon PE 9.9.1.7 一起使用:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tei="http://www.tei-c.org/ns/1.0"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="xml" version="1.0" indent="no"/>
<xsl:template match="@* | node()" name="identity-copy">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- lb followed by rs -->
<xsl:template match="text()[preceding-sibling::*[1][self::*:lb[@*]]][following-sibling::*[1][self::*:rs[@*]]][string-length(normalize-space()) = 0]"/>
</xsl:stylesheet>
在输出的 XML 文件中,有一些新属性被添加到我什至没有在我的样式表中提及的元素中。 例如。 @status='draft'
添加到 <revisionDesc>/<change>
(不在输入示例中),@part='N'
添加到 <p>
。我可以列出更多示例,但我认为这是一个普遍问题。我怎样才能避免这种情况?
提前致谢!
如果您使用的是 Saxon,则可以选择禁止扩展架构或 DTD-defined 默认属性值。 (虽然它不适用于所有 XML 解析器,但有些解析器没有此选项)。在 Oxygen“配置转换场景”对话框中,它显示有一个复选框 'Expand attribute defaults ("-expand")'。
在 Oxygen“Relax NG”首选项页面中,有一个“添加默认属性”复选框,您可以取消选中该复选框:https://www.oxygenxml.com/doc/versions/23.1/ug-editor/topics/relax-ng-preferences-page.html
我想使用 XSLT 转换 XML 文件。在转换过程中,输出文件中添加了一些我无法理解的新属性。
输入XML文件(缩写):
<?xml version="1.0" encoding="UTF-8"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<teiHeader>
<fileDesc>
<titleStmt>
<title/>
</titleStmt>
<publicationStmt>
<publisher/>
</publicationStmt>
<sourceDesc>
<p/>
</sourceDesc>
</fileDesc>
</teiHeader>
<text>
<body>
<pb n="1"/>
<p xml:id="uuid_f770d0a9-277a-42d5-a759-a02b05a29a49">
<lb xml:id="uuid_cf21b2a4-e5b2-4ced-a1b2-a4e5b29ced0a"/>This is
<lb xml:id="uuid_dffd4def-3f7a-4d5b-bd4d-ef3f7abd5bf9"/> <rs type="person">an example</rs>.
</p>
</body>
</text>
</TEI>
用于删除 <lb/>
和 <rs>
之间不需要的空格的 XSLT 样式表(上面输入文件中的第 2 行)与 Saxon PE 9.9.1.7 一起使用:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tei="http://www.tei-c.org/ns/1.0"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="xml" version="1.0" indent="no"/>
<xsl:template match="@* | node()" name="identity-copy">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- lb followed by rs -->
<xsl:template match="text()[preceding-sibling::*[1][self::*:lb[@*]]][following-sibling::*[1][self::*:rs[@*]]][string-length(normalize-space()) = 0]"/>
</xsl:stylesheet>
在输出的 XML 文件中,有一些新属性被添加到我什至没有在我的样式表中提及的元素中。 例如。 @status='draft'
添加到 <revisionDesc>/<change>
(不在输入示例中),@part='N'
添加到 <p>
。我可以列出更多示例,但我认为这是一个普遍问题。我怎样才能避免这种情况?
提前致谢!
如果您使用的是 Saxon,则可以选择禁止扩展架构或 DTD-defined 默认属性值。 (虽然它不适用于所有 XML 解析器,但有些解析器没有此选项)。在 Oxygen“配置转换场景”对话框中,它显示有一个复选框 'Expand attribute defaults ("-expand")'。
在 Oxygen“Relax NG”首选项页面中,有一个“添加默认属性”复选框,您可以取消选中该复选框:https://www.oxygenxml.com/doc/versions/23.1/ug-editor/topics/relax-ng-preferences-page.html