XSLT 匹配和命名空间 [重复]
Posted
技术标签:
【中文标题】XSLT 匹配和命名空间 [重复]【英文标题】:XSLT matching and namespaces [duplicate] 【发布时间】:2018-03-10 17:26:55 【问题描述】:我正在尝试使用 XSLT 转换 XML。
如果我从 XSLT 和 XML 中删除命名空间信息,它可以正常工作,但我无法让它与适当的命名空间信息一起工作。
下面是失败的 XSLT 的样子:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:dcterms="http://purl.org/dc/terms/">
<xsl:template match="node()|@*">
<full>
<xsl:apply-templates select="//dc"/>
</full>
</xsl:template>
<xsl:template match="dc">
<record>
<xsl:apply-templates select="dcterms:title"/>
<xsl:apply-templates select="dcterms:type"/>
</record>
</xsl:template>
<xsl:template match="dcterms:title">
<xsl:element name="dcterms:title"><xsl:value-of select="."/></xsl:element>
</xsl:template>
<xsl:template match="dcterms:type">
<xsl:element name="dcterms:type"><xsl:value-of select="."/></xsl:element>
</xsl:template>
</xsl:stylesheet>
这是它运行的 XML:
<?xml version="1.0" encoding="UTF-8"?>
<OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
<responseDate>2015-10-11T00:35:52Z</responseDate>
<ListRecords>
<record>
<metadata>
<dc xmlns="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:edm="http://www.europeana.eu/schemas/edm/" xmlns:oai-pmh="http://www.openarchives.org/OAI/2.0/" xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:oai_qdc="http://worldcat.org/xmlschemas/qdc-1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd http://worldcat.org/xmlschemas/qdc-1.0/ http://worldcat.org/xmlschemas/qdc/1.0/qdc-1.0.xsd http://purl.org/net/oclcterms http://worldcat.org/xmlschemas/oclcterms/1.4/oclcterms-1.4.xsd">
<edm:dataProvider>Some University</edm:dataProvider>
<edm:rights>https://library.someplace.edu/statements/rights</edm:rights>
<dcterms:title>This is a title</dcterms:title>
<dcterms:type>Image</dcterms:type>
<dcterms:creator>This is a creator</dcterms:creator>
<dc:date>1981-07-17</dc:date>
<dc:format/>
<dc:format/>
</dc>
</metadata>
</record>
<record>
<metadata>
<dc xmlns="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:edm="http://www.europeana.eu/schemas/edm/" xmlns:oai-pmh="http://www.openarchives.org/OAI/2.0/" xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:oai_qdc="http://worldcat.org/xmlschemas/qdc-1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd http://worldcat.org/xmlschemas/qdc-1.0/ http://worldcat.org/xmlschemas/qdc/1.0/qdc-1.0.xsd http://purl.org/net/oclcterms http://worldcat.org/xmlschemas/oclcterms/1.4/oclcterms-1.4.xsd">
<edm:dataProvider>Some University</edm:dataProvider>
<edm:rights>https://library.someplace.edu/statements/rights</edm:rights>
<dcterms:title>This is another title</dcterms:title>
<dcterms:type>Image</dcterms:type>
<dcterms:creator>This is a creator</dcterms:creator>
<dc:date>1981-07-24</dc:date>
<dc:format/>
<dc:format/>
</dc>
</metadata>
</record>
</ListRecords>
</OAI-PMH>
失败的输出如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<full xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/"/>
这就是我希望得到的:
<?xml version="1.0" encoding="UTF-8"?>
<full>
<record>
<title>This is a title</title>
<type>Image</type>
</record>
<record>
<title>This is another title</title>
<type>Image</type>
</record>
</full>
“记录”元素的缺失清楚地表明“dc”没有被匹配,但我不确定我需要做什么来匹配这些元素。
我在 CentOS 机器上使用 Saxon,如果这很重要的话。
Saxon 抛出消息“找不到 CatalogManager.properties”,无论它是失败(使用启用命名空间的代码)还是正常工作(使用无命名空间的代码)。根据我目前在网上看到的情况,我怀疑这与此无关,但不能发誓。
我假设这很简单,但是作为一个新的 XSLT 用户,它使用一个充满命名空间的 XML 文档(比我上面的示例中列出的更多),我对命名空间的意大利面条有点困惑创建。
【问题讨论】:
您的样式表正在尝试选择和匹配扩展名为“dc”的元素在无命名空间中。您的输入文档没有此类元素,但在命名空间http://www.openarchives.org/OAI/2.0/oai_dc/
中确实有扩展名为“dc”的元素。
搜索“XSLT 默认命名空间”将为您提供 612 个相同的问题。几乎每天都有人问这个问题。
【参考方案1】:
预期的输出可以通过以下方式非常简单地实现:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:oai="http://www.openarchives.org/OAI/2.0/"
xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/"
xmlns:dcterms="http://purl.org/dc/terms/"
exclude-result-prefixes="oai oai_dc dcterms">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/oai:OAI-PMH">
<full>
<xsl:for-each select="oai:ListRecords/oai:record">
<record>
<title>
<xsl:value-of select="oai:metadata/oai_dc:dc/dcterms:title" />
</title>
<type>
<xsl:value-of select="oai:metadata/oai_dc:dc/dcterms:type" />
</type>
</record>
</xsl:for-each>
</full>
</xsl:template>
</xsl:stylesheet>
【讨论】:
以上是关于XSLT 匹配和命名空间 [重复]的主要内容,如果未能解决你的问题,请参考以下文章