xstl 转换在结果元素中插入名称空间(重新访问)
xstl transform inserts namespace in result elements (revisited)
我有一个 xml 文件,我需要在其中重命名元素。 (后来也将元素转换为属性)。 xslt 转换将默认名称空间插入到所有顶级元素中。我不想要那个。我已经看到很多关于这个问题的问题,但仍然对预期的结果有疑问并理解为什么...
- 我对 exclude-result-prefixes 能做的最好的事情是:
<ar xmlns="">
<dyu xmlns="http://www.coastsystems.net">ábada</dyu>
为什么命名空间只从 ar 中删除?为什么它保留 xmlns=""?
- 如果我删除 转换的重命名部分,那么它基本上只是复制原始文件:
<xsl:template match="/c:lexique/c:headword">
<ar>
<xsl:apply-templates select="@* | node()"/>
</ar>
</xsl:template>
然后'exclude-result-prefixes'好像一点效果都没有。无论是否存在,都没有插入命名空间。为什么?
xslt3 有问题吗?我需要使用它,因为它可以处理拉丁扩展字符并正确排序。
xml如下:
<?xml version='1.0' encoding='utf-8'?>
<lexique xmlns="http://www.coastsystems.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.coastsystems.net headwords2.xsd"
>
<headword>
<dyu>ábada</dyu>
<alt>abada</alt>
<emp></emp>
<cf>fewu</cf>
<trans>
<lang>fr</lang>
<detail></detail>
<speech>
<type></type>
<t-uuid>7b8612bc-23c7-4241-817f-f6fcd9bff8ac</t-uuid>
<def>
<gloss>jamais</gloss>
<gl-id>bbc05aae-8f08-4ab7-91ae-3b52533a896f</gl-id>
<note2></note2>
<note3></note3>
<note4></note4>
<tags></tags>
<example>
<source>a tɛ koɲuman kɛ abada.</source>
<target>Il ne fait jamais quelque chose de bien.</target>
<ex-id>2c592b68-0d29-4b6c-8614-005adab4fba5</ex-id>
</example>
</def>
</speech>
</trans>
</headword>
</lexique>
使用 xslt 样式表:
<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:c="http://www.coastsystems.net"
exclude-result-prefixes="xsl c"
>
<xsl:output method="xml" indent="yes" encoding="UTF-8" />
<xsl:template match="/">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/c:lexique/c:headword">
<ar>
<xsl:apply-templates select="@* | node()"/>
</ar>
</xsl:template>
</xsl:stylesheet>
(xslt3 -xsl:rename.xsl -s:headwords.xml)
输出:
<?xml version="1.0" encoding="UTF-8"?>
<lexique xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.coastsystems.net" xsi:schemaLocation="http://www.coastsystems.net headwords2.xsd">
<ar xmlns="">
<dyu xmlns="http://www.coastsystems.net">ábada</dyu>
<alt xmlns="http://www.coastsystems.net">abada</alt>
<emp xmlns="http://www.coastsystems.net"/>
<cf xmlns="http://www.coastsystems.net">fewu</cf>
<trans xmlns="http://www.coastsystems.net">
<lang>fr</lang>
<detail/>
<speech>
<type/>
<t-uuid>7b8612bc-23c7-4241-817f-f6fcd9bff8ac</t-uuid>
<def>
<gloss>jamais</gloss>
<gl-id>bbc05aae-8f08-4ab7-91ae-3b52533a896f</gl-id>
<note2/>
<note3/>
<note4/>
<tags/>
<example>
<source>a tɛ koɲuman kɛ abada.</source>
<target>Il ne fait jamais quelque chose de bien.</target>
<ex-id>2c592b68-0d29-4b6c-8614-005adab4fba5</ex-id>
</example>
</def>
</speech>
</trans>
</ar>
期望的输出:
<?xml version="1.0" encoding="UTF-8"?>
<lexique xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.coastsystems.net" xsi:schemaLocation="http://www.coastsystems.net headwords2.xsd">
<ar>
<dyu>ábada</dyu>
<alt>abada</alt>
<emp/>
<cf>fewu</cf>
<trans>
<lang>fr</lang>
<detail/>
===== snipped
exclude-result-prefixes
的指令仅在不使用时排除它们。如果您希望在没有名称空间的情况下生成其他元素,则需要创建没有名称空间的元素(使用 local-name()
),而不是使用 xsl:copy
.
您可以通过为任何元素添加一个通用模板来实现这一点(遵循匹配 @*|node()
的身份模板,以便它具有更高的优先级匹配。
如果您希望所有元素都绑定到 `` 命名空间,但不使用前缀,则在样式表中设置默认命名空间 xmlns="http://www.coastsystems.net"
:
<xsl:stylesheet version="2.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.coastsystems.net"
xmlns:c="http://www.coastsystems.net"
exclude-result-prefixes="xsl c"
>
<xsl:output method="xml" indent="yes" encoding="UTF-8" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="/c:lexique/c:headword">
<ar>
<xsl:apply-templates select="@* | node()"/>
</ar>
</xsl:template>
</xsl:stylesheet>
您还可以更改身份模板的匹配表达式以列出特定的 node()
而不是包括 *
:@*|text()|comment()|processing-instruction()
.
我有一个 xml 文件,我需要在其中重命名元素。 (后来也将元素转换为属性)。 xslt 转换将默认名称空间插入到所有顶级元素中。我不想要那个。我已经看到很多关于这个问题的问题,但仍然对预期的结果有疑问并理解为什么...
- 我对 exclude-result-prefixes 能做的最好的事情是:
<ar xmlns="">
<dyu xmlns="http://www.coastsystems.net">ábada</dyu>
为什么命名空间只从 ar 中删除?为什么它保留 xmlns=""?
- 如果我删除 转换的重命名部分,那么它基本上只是复制原始文件:
<xsl:template match="/c:lexique/c:headword">
<ar>
<xsl:apply-templates select="@* | node()"/>
</ar>
</xsl:template>
然后'exclude-result-prefixes'好像一点效果都没有。无论是否存在,都没有插入命名空间。为什么?
xslt3 有问题吗?我需要使用它,因为它可以处理拉丁扩展字符并正确排序。
xml如下:
<?xml version='1.0' encoding='utf-8'?>
<lexique xmlns="http://www.coastsystems.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.coastsystems.net headwords2.xsd"
>
<headword>
<dyu>ábada</dyu>
<alt>abada</alt>
<emp></emp>
<cf>fewu</cf>
<trans>
<lang>fr</lang>
<detail></detail>
<speech>
<type></type>
<t-uuid>7b8612bc-23c7-4241-817f-f6fcd9bff8ac</t-uuid>
<def>
<gloss>jamais</gloss>
<gl-id>bbc05aae-8f08-4ab7-91ae-3b52533a896f</gl-id>
<note2></note2>
<note3></note3>
<note4></note4>
<tags></tags>
<example>
<source>a tɛ koɲuman kɛ abada.</source>
<target>Il ne fait jamais quelque chose de bien.</target>
<ex-id>2c592b68-0d29-4b6c-8614-005adab4fba5</ex-id>
</example>
</def>
</speech>
</trans>
</headword>
</lexique>
使用 xslt 样式表:
<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:c="http://www.coastsystems.net"
exclude-result-prefixes="xsl c"
>
<xsl:output method="xml" indent="yes" encoding="UTF-8" />
<xsl:template match="/">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/c:lexique/c:headword">
<ar>
<xsl:apply-templates select="@* | node()"/>
</ar>
</xsl:template>
</xsl:stylesheet>
(xslt3 -xsl:rename.xsl -s:headwords.xml)
输出:
<?xml version="1.0" encoding="UTF-8"?>
<lexique xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.coastsystems.net" xsi:schemaLocation="http://www.coastsystems.net headwords2.xsd">
<ar xmlns="">
<dyu xmlns="http://www.coastsystems.net">ábada</dyu>
<alt xmlns="http://www.coastsystems.net">abada</alt>
<emp xmlns="http://www.coastsystems.net"/>
<cf xmlns="http://www.coastsystems.net">fewu</cf>
<trans xmlns="http://www.coastsystems.net">
<lang>fr</lang>
<detail/>
<speech>
<type/>
<t-uuid>7b8612bc-23c7-4241-817f-f6fcd9bff8ac</t-uuid>
<def>
<gloss>jamais</gloss>
<gl-id>bbc05aae-8f08-4ab7-91ae-3b52533a896f</gl-id>
<note2/>
<note3/>
<note4/>
<tags/>
<example>
<source>a tɛ koɲuman kɛ abada.</source>
<target>Il ne fait jamais quelque chose de bien.</target>
<ex-id>2c592b68-0d29-4b6c-8614-005adab4fba5</ex-id>
</example>
</def>
</speech>
</trans>
</ar>
期望的输出:
<?xml version="1.0" encoding="UTF-8"?>
<lexique xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.coastsystems.net" xsi:schemaLocation="http://www.coastsystems.net headwords2.xsd">
<ar>
<dyu>ábada</dyu>
<alt>abada</alt>
<emp/>
<cf>fewu</cf>
<trans>
<lang>fr</lang>
<detail/>
===== snipped
exclude-result-prefixes
的指令仅在不使用时排除它们。如果您希望在没有名称空间的情况下生成其他元素,则需要创建没有名称空间的元素(使用 local-name()
),而不是使用 xsl:copy
.
您可以通过为任何元素添加一个通用模板来实现这一点(遵循匹配 @*|node()
的身份模板,以便它具有更高的优先级匹配。
如果您希望所有元素都绑定到 `` 命名空间,但不使用前缀,则在样式表中设置默认命名空间 xmlns="http://www.coastsystems.net"
:
<xsl:stylesheet version="2.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.coastsystems.net"
xmlns:c="http://www.coastsystems.net"
exclude-result-prefixes="xsl c"
>
<xsl:output method="xml" indent="yes" encoding="UTF-8" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="/c:lexique/c:headword">
<ar>
<xsl:apply-templates select="@* | node()"/>
</ar>
</xsl:template>
</xsl:stylesheet>
您还可以更改身份模板的匹配表达式以列出特定的 node()
而不是包括 *
:@*|text()|comment()|processing-instruction()
.