xslt 身份转换的奇怪行为
Odd behavior with xslt identity transform
我在 xslt 转换中遇到了一些奇怪的事情,这可能是一个真正的问题,也可能只是我忘记了什么。任何附加了 xsl:apply 模板的内容都会导致空白 space,我不明白为什么。
我使用的xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<TEI.2>
<teiHeader>
<fileDesc>
<titleStmt>
<title>William of Palerne: An Electronic Edition</title>
<author>Anonymous</author>
<editor>Edited by G. H. V. Bunt</editor>
<respStmt>
<resp>
<hi rend="bold">Computer Consultants and Programmers</hi>
</resp>
<name> Susan Gants, Susan Munson, Daniel Pitti, and John Unsworth.</name>
</respStmt>
</titleStmt>
</fileDesc>
</teiHeader>
</TEI>
我申请的xslt如下:
<?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 tei"
version="2.0">
<xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="TEI.2">
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<xsl:apply-templates/>
</TEI>
</xsl:template>
<xsl:template match="teiHeader">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
我希望我的结果是原始的 XML,将 TEI.2 转换为 TEI 并添加名称space:
<?xml version="1.0" encoding="UTF-8"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<teiHeader>
<fileDesc>
<titleStmt>
<title>William of Palerne: An Electronic Edition</title>
<author>Anonymous</author>
<editor>Edited by G. H. V. Bunt</editor>
<respStmt>
<resp>
<hi rend="bold">Computer Consultants and Programmers</hi>
</resp>
<name> Susan Gants, Susan Munson, Daniel Pitti, and John Unsworth.</name>
</respStmt>
</titleStmt>
</fileDesc>
</teiHeader>
</TEI>
相反,TEI.2 按预期更改为 TEI,但没有出现 teiHeader:
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<fileDesc xmlns="">
<titleStmt>
<title>William of Palerne: An Electronic Edition</title>
<author>Anonymous</author>
<editor>Edited by G. H. V. Bunt</editor>
<respStmt>
<resp>
<hi>Computer Consultants and Programmers</hi>
</resp>
<name> Susan Gants, Susan Munson, Daniel Pitti, and John Unsworth.</name>
</respStmt>
</titleStmt>
</fileDesc>
</TEI>
我确定我犯了错误或忽略了某些东西,但我终究无法弄清楚它是什么。如果有人能告诉我是什么让我陷入困境以及如何纠正它,我将不胜感激。
teiHeader
没有出现因为这个模板:
<xsl:template match="teiHeader">
<xsl:apply-templates/>
</xsl:template>
您正在匹配 teiHeader
,但是一旦匹配您就不会复制它,而是将控制权传递给它的子节点,从而导致没有 teiHeader
被写入输出。
现在,您只需删除此模板,即可创建 teiHeader
。但是,你会看到它会像这样输出
<teiHeader xmlns="">
这是因为在输入 XML 中 teiHeader
不属于任何命名空间,因此标识模板只是在输出中创建相同的元素,也不在任何命名空间中。
即使您在命名空间中创建根 TEI
元素,这也不会自动将您创建的任何子元素添加到该命名空间。您需要为此添加单独的模板。
试试这个 XSLT
<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 tei"
version="2.0">
<xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="TEI.2">
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<xsl:apply-templates/>
</TEI>
</xsl:template>
<xsl:template match="*" priority="2">
<xsl:element name="{local-name()}" namespace="http://www.tei-c.org/ns/1.0">
<xsl:apply-templates select="node()|@*" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
priority="2"
用于确保模板获得比标识模板更高的优先级。
还要注意它是如何做的 <xsl:apply-templates select="node()|@*" />
而不是 <xsl:apply-templates />
因为后者只选择节点,而不选择属性。
我在 xslt 转换中遇到了一些奇怪的事情,这可能是一个真正的问题,也可能只是我忘记了什么。任何附加了 xsl:apply 模板的内容都会导致空白 space,我不明白为什么。
我使用的xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<TEI.2>
<teiHeader>
<fileDesc>
<titleStmt>
<title>William of Palerne: An Electronic Edition</title>
<author>Anonymous</author>
<editor>Edited by G. H. V. Bunt</editor>
<respStmt>
<resp>
<hi rend="bold">Computer Consultants and Programmers</hi>
</resp>
<name> Susan Gants, Susan Munson, Daniel Pitti, and John Unsworth.</name>
</respStmt>
</titleStmt>
</fileDesc>
</teiHeader>
</TEI>
我申请的xslt如下:
<?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 tei"
version="2.0">
<xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="TEI.2">
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<xsl:apply-templates/>
</TEI>
</xsl:template>
<xsl:template match="teiHeader">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
我希望我的结果是原始的 XML,将 TEI.2 转换为 TEI 并添加名称space:
<?xml version="1.0" encoding="UTF-8"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<teiHeader>
<fileDesc>
<titleStmt>
<title>William of Palerne: An Electronic Edition</title>
<author>Anonymous</author>
<editor>Edited by G. H. V. Bunt</editor>
<respStmt>
<resp>
<hi rend="bold">Computer Consultants and Programmers</hi>
</resp>
<name> Susan Gants, Susan Munson, Daniel Pitti, and John Unsworth.</name>
</respStmt>
</titleStmt>
</fileDesc>
</teiHeader>
</TEI>
相反,TEI.2 按预期更改为 TEI,但没有出现 teiHeader:
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<fileDesc xmlns="">
<titleStmt>
<title>William of Palerne: An Electronic Edition</title>
<author>Anonymous</author>
<editor>Edited by G. H. V. Bunt</editor>
<respStmt>
<resp>
<hi>Computer Consultants and Programmers</hi>
</resp>
<name> Susan Gants, Susan Munson, Daniel Pitti, and John Unsworth.</name>
</respStmt>
</titleStmt>
</fileDesc>
</TEI>
我确定我犯了错误或忽略了某些东西,但我终究无法弄清楚它是什么。如果有人能告诉我是什么让我陷入困境以及如何纠正它,我将不胜感激。
teiHeader
没有出现因为这个模板:
<xsl:template match="teiHeader">
<xsl:apply-templates/>
</xsl:template>
您正在匹配 teiHeader
,但是一旦匹配您就不会复制它,而是将控制权传递给它的子节点,从而导致没有 teiHeader
被写入输出。
现在,您只需删除此模板,即可创建 teiHeader
。但是,你会看到它会像这样输出
<teiHeader xmlns="">
这是因为在输入 XML 中 teiHeader
不属于任何命名空间,因此标识模板只是在输出中创建相同的元素,也不在任何命名空间中。
即使您在命名空间中创建根 TEI
元素,这也不会自动将您创建的任何子元素添加到该命名空间。您需要为此添加单独的模板。
试试这个 XSLT
<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 tei"
version="2.0">
<xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="TEI.2">
<TEI xmlns="http://www.tei-c.org/ns/1.0">
<xsl:apply-templates/>
</TEI>
</xsl:template>
<xsl:template match="*" priority="2">
<xsl:element name="{local-name()}" namespace="http://www.tei-c.org/ns/1.0">
<xsl:apply-templates select="node()|@*" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
priority="2"
用于确保模板获得比标识模板更高的优先级。
还要注意它是如何做的 <xsl:apply-templates select="node()|@*" />
而不是 <xsl:apply-templates />
因为后者只选择节点,而不选择属性。