我是XSLT的新手(约1小时),不幸的是,目前我没有太多时间学习它(我有一个里程碑)所以我想知道是否有人可以帮我定义一个XSLT来转换这样一个文件:
<?xml version="1.0" encoding="UTF-8"?>
<epics-doi xmlns:dc="http://dublincore.org/documents/dcmi-namespace/">
<record>
26.03.2012PK_000404500
<dc:identifier>a</dc:identifier>
313
<dc:identifier>1</dc:identifier>
</record>
<record>
26.03.2012PK_000404500
<dc:identifier>b</dc:identifier>
313
<dc:identifier>2</dc:identifier>
</record>
...
</epics-doi>
进入这个:
<?xml version="1.0" encoding="UTF-8" ?>
<OAI-PMH>
<responseDate></responseDate>
<request></request>
<ListRecords>
<record>
<header>
<identifier></identifier>
<datestamp></datestamp>
<setSpec></setSpec>
</header>
<metadata>
<oai_dc:dc>
<dc:type></dc:type>
<dc:language></dc:language>
<dc:identifier>a</dc:identifier>
<dc:title></dc:title>
<dc:publisher></dc:publisher>
<dc:publisher></dc:publisher>
<dc:date></dc:date>
<dc:format></dc:format>
<dc:creator></dc:creator>
<dc:contributor></dc:contributor>
<dc:identifier>1</dc:identifier>
</oai_dc:dc>
</metadata>
</record>
<record>
<header>
<identifier></identifier>
<datestamp></datestamp>
<setSpec></setSpec>
</header>
<metadata>
<oai_dc:dc>
<dc:type></dc:type>
<dc:language></dc:language>
<dc:identifier>b</dc:identifier>
<dc:title></dc:title>
<dc:publisher></dc:publisher>
<dc:publisher></dc:publisher>
<dc:date></dc:date>
<dc:format></dc:format>
<dc:creator></dc:creator>
<dc:contributor></dc:contributor>
<dc:identifier>2</dc:identifier>
</oai_dc:dc>
</metadata>
</record>
...
</ListRecords>
</OAI-PMH>
我试过这个(留下一些标签):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<xsl:apply-templates select="/epics-doi/record/metadata" />
</xsl:template>
<xsl:template match="metadata">
<oai_dc:dc xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/dc/terms/" 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">
<xsl:for-each select="dc:identifier">
<dc:identifier>
<xsl:value-of select="dc:identifier" />
</dc:identifier>
</xsl:for-each>
</oai_dc:dc>
</xsl:template>
</xsl:stylesheet>
但我不知道我是否在正确的轨道上,好像我在Firefox中加载文件一样,页面仍然是空白的......
非常感谢你!
谢谢凯文。你的XSLT是对的,但它有一个问题: 如果我有多个记录(如上例所示),我在得到的XML中也会得到两条记录,但在每条记录中都有4条dc:identifier;每个记录都添加了每个标识符......:
<?xml version="1.0" encoding="utf-8"?>
<OAI-PMH xmlns:dc="http://dublincore.org/documents/dcmi-namespace/"
xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/">
<responseDate/>
<request/>
<ListRecords>
<record>
<header>
<identifier/>
<datestamp/>
<setSpec/>
</header>
<metadata>
<oai_dc:dc>
<dc:type/>
<dc:language/>
<dc:title/>
<dc:publisher/>
<dc:publisher/>
<dc:date/>
<dc:format/>
<dc:creator/>
<dc:contributor/>
<dc:identifier>a</dc:identifier>
<dc:identifier>1</dc:identifier>
<dc:identifier>b</dc:identifier>
<dc:identifier>2</dc:identifier>
</oai_dc:dc>
</metadata>
</record>
<record>
<header>
<identifier/>
<datestamp/>
<setSpec/>
</header>
<metadata>
<oai_dc:dc>
<dc:type/>
<dc:language/>
<dc:title/>
<dc:publisher/>
<dc:publisher/>
<dc:date/>
<dc:format/>
<dc:creator/>
<dc:contributor/>
<dc:identifier>a</dc:identifier>
<dc:identifier>1</dc:identifier>
<dc:identifier>b</dc:identifier>
<dc:identifier>2</dc:identifier>
</oai_dc:dc>
</metadata>
</record>
</ListRecords>
</OAI-PMH>
答案 0 :(得分:3)
试试这个:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dc="http://dublincore.org/documents/dcmi-namespace/"
xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/">
<xsl:output method="xml"/>
<xsl:template match="/">
<OAI-PMH>
<responseDate></responseDate>
<request></request>
<ListRecords>
<xsl:apply-templates select="/epics-doi/record"/>
</ListRecords>
</OAI-PMH>
</xsl:template>
<xsl:template match="/epics-doi/record">
<record>
<header>
<identifier></identifier>
<datestamp></datestamp>
<setSpec></setSpec>
</header>
<metadata>
<oai_dc:dc>
<dc:type></dc:type>
<dc:language></dc:language>
<dc:title></dc:title>
<dc:publisher></dc:publisher>
<dc:publisher></dc:publisher>
<dc:date></dc:date>
<dc:format></dc:format>
<dc:creator></dc:creator>
<dc:contributor></dc:contributor>
<xsl:apply-templates select="/epics-doi/record/dc:identifier"/>
</oai_dc:dc>
</metadata>
</record>
</xsl:template>
<xsl:template match="/epics-doi/record/dc:identifier">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
我注意到的一个问题是XML中的dc名称空间是“http://dublincore.org/documents/dcmi-namespace/但它是”http://purl.org/dc/elements/1.1/“在XSL中 - 我认为这不起作用
答案 1 :(得分:2)
<xsl:apply-templates select="/epics-doi/record/metadata"/>
您的/epics-doi/record
节点不包含任何metadata
节点,因此这与任何内容都不匹配。
你应该使用
<xsl:apply-templates select="/epics-doi/record"/>
与
一起<xsl:template match="record">
<!-- Transformation here -->
</xsl:template>
提示: 您可以使用像oXygen这样的工具来开发XSLT(对不起,我从来没用过任何所以我不知道开源的)
此外,您不需要在foreach选择中使用dc:
,在循环内部已经选择了节点。我认为它看起来应该更像:
<xsl:for-each select="identifier">
<dc:identifier>
<xsl:value-of select="."/>
</dc:identifier>
</xsl:for-each>
答案 2 :(得分:0)
我以这种方式修改了你的答案,现在它有效......
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dc="http://dublincore.org/documents/dcmi-namespace/"
xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/">
<xsl:output method="xml"/>
<xsl:template match="/">
<OAI-PMH>
<ListRecords>
<xsl:apply-templates select="epics-doi/record"/>
</ListRecords>
</OAI-PMH>
</xsl:template>
<xsl:template match="record">
<record>
<header>
</header>
<metadata>
<oai_dc:dc>
<xsl:apply-templates select="dc:identifier"/>
</oai_dc:dc>
</metadata>
</record>
</xsl:template>
<xsl:template match="dc:identifier">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
再次感谢你。