XPath 中引用的源文件中的 XSLT 命名空间
XSLT namespace in source file referencing in XPath
我花了几个小时解决我的问题,直到我意识到 XSL 文件中的 XPath 与我的源文档不匹配,只要在 XML:
中定义了一个命名空间
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<clonkDoc xmlns="https://clonkspot.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://clonkspot.org ../../../clonk.xsd">
<func>
<some-more-elements/>
</func>
<author>Author</author><date>lazy date</date>
</clonkDoc>
据我所知需要 xmlns="https://clonkspot.org"
可以用 XSD.
引用文档
我的 XSL 文件如下所示(此处未显示“head”和“nav”):
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:clonk="https://clonkspot.org">
<xsl:output method="html" encoding="ISO-8859-1" doctype-public="-//W3C//DTD HTML 4.01//EN"
doctype-system="http://www.w3.org/TR/html4/strict.dtd"/>
<xsl:template match="/clonk:clonkDoc/clonk:func">
<html>
<xsl:call-template name="head"/>
<body>
<xsl:call-template name="nav"/>
<h1>
</h1>
</body>
</html>
</xsl:template>
结果如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns:clonk="https://clonkspot.org">
<head>...
</head>
<body>
<h1></h1>
</body>
</html>
Authorlazy date
我有两个问题:
- 我在目标 html 文档中没有“clonk:”元素,但在
<html>
元素中定义了命名空间。
- 我想在 XSL 的所有 XPath 中保存“clonk:”。
如何告诉 XSLT 处理器将 <template match="/clonkDoc/func">
解释为源 XML 文档的默认名称空间(其中 xmlns="https://clonkspot.org"
)?
非常感谢!
要从输出中排除 xmlns:clonk="https://clonkspot.org"
声明,请将其添加到 xsl:stylesheet
start-tag。
exclude-result-prefixes="clonk"
我不明白你的第二个问题。如果您询问如何定义一个默认名称空间,该名称空间将用于样式表中任何 XPath 表达式中包含的任何无前缀元素名称,那么答案是您需要 XSLT 2.0:
https://www.w3.org/TR/xslt20/#unprefixed-qnames
我花了几个小时解决我的问题,直到我意识到 XSL 文件中的 XPath 与我的源文档不匹配,只要在 XML:
中定义了一个命名空间<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<clonkDoc xmlns="https://clonkspot.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://clonkspot.org ../../../clonk.xsd">
<func>
<some-more-elements/>
</func>
<author>Author</author><date>lazy date</date>
</clonkDoc>
据我所知需要 xmlns="https://clonkspot.org"
可以用 XSD.
我的 XSL 文件如下所示(此处未显示“head”和“nav”):
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:clonk="https://clonkspot.org">
<xsl:output method="html" encoding="ISO-8859-1" doctype-public="-//W3C//DTD HTML 4.01//EN"
doctype-system="http://www.w3.org/TR/html4/strict.dtd"/>
<xsl:template match="/clonk:clonkDoc/clonk:func">
<html>
<xsl:call-template name="head"/>
<body>
<xsl:call-template name="nav"/>
<h1>
</h1>
</body>
</html>
</xsl:template>
结果如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns:clonk="https://clonkspot.org">
<head>...
</head>
<body>
<h1></h1>
</body>
</html>
Authorlazy date
我有两个问题:
- 我在目标 html 文档中没有“clonk:”元素,但在
<html>
元素中定义了命名空间。 - 我想在 XSL 的所有 XPath 中保存“clonk:”。
如何告诉 XSLT 处理器将 <template match="/clonkDoc/func">
解释为源 XML 文档的默认名称空间(其中 xmlns="https://clonkspot.org"
)?
非常感谢!
要从输出中排除 xmlns:clonk="https://clonkspot.org"
声明,请将其添加到 xsl:stylesheet
start-tag。
exclude-result-prefixes="clonk"
我不明白你的第二个问题。如果您询问如何定义一个默认名称空间,该名称空间将用于样式表中任何 XPath 表达式中包含的任何无前缀元素名称,那么答案是您需要 XSLT 2.0: https://www.w3.org/TR/xslt20/#unprefixed-qnames