xml - XSLT 匹配和命名空间

标签 xml xslt namespaces

这个问题在这里已经有了答案:





XSLT with XML source that has a default namespace set to xmlns

(3 个回答)


4年前关闭。




我有我正在尝试使用 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 文档,我对命名空间创建的意大利面条有点困惑。

最佳答案

可以很简单地通过以下方式实现预期的输出:

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>

关于xml - XSLT 匹配和命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46478119/

相关文章:

java - Android 中的 Facebook sdk 登录问题

android - 在 TextView 中居中文本

xml - 在 Visual Studio 中使用 XSL 标记或拆分字符串

java - 在 IBM Content Navigator 插件中使用 XSLT

sql-server - 粉碎 XML 文件未返回所有数据

android getElementsByTagName 返回空列表

XSLT:如何删除同义 namespace

php - 现代 PHP 书籍 - 使用命名空间时关于 "use"和 "require"的澄清

r - 如何导入 .R 文件并为其指定别名?就像 import myfile.R as mf

c++ - constexpr 与匿名命名空间