我尝试使用XSLT从API XML响应文件中选择属性 这是返回XML文件的请求:http://zoekdienst.overheid.nl/sru/Search?version=1.2&operation=searchRetrieve&x-connection=oep&startRecord=1&maximumRecords=10&query=(keyword=verkeersbesluit) and (creator=groningen) and (organisationType=Provincie)
我创建了以下XSL文件:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:overheid="http://standaarden.overheid.nl/owms/terms/" xmlns:overheidop="http://standaarden.overheid.nl/product/terms/" xmlns:overheidvb="http://standaarden.overheid.nl/vb/terms">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<verkeersbesluiten>
<test>Hello world!</test>
<numberOfRecords><xsl:value-of select="searchRetrieveResponse/numberOfRecords"/></numberOfRecords>
<xsl:for-each select="searchRetrieveResponse/records/record/recordData/gzd/originalData/overheidop:meta/overheidop:owmskern">
<besluit>
<test2>Hello world again!</test2>
<titel><xsl:value-of select="dcterms:title"/></titel>
<locatie><xsl:value-of select="dcterms:spatial"/></locatie>
</besluit>
</xsl:for-each>
</verkeersbesluiten>
</xsl:template>
</xsl:stylesheet>
转换后生成的文件:
<?xml version="1.0" encoding="UTF-8"?>
<verkeersbesluiten xmlns:dcterms="http://purl.org/dc/terms/" xmlns:overheid="http://standaarden.overheid.nl/owms/terms/" xmlns:overheidop="http://standaarden.overheid.nl/product/terms/" xmlns:overheidvb="http://standaarden.overheid.nl/vb/terms">
<test>Hello world!</test>
<numberOfRecords/>
</verkeersbesluiten>
这不是我想要的结果。那将是:
<?xml version="1.0" encoding="UTF-8"?>
<verkeersbesluiten xmlns:dcterms="http://purl.org/dc/terms/" xmlns:overheid="http://standaarden.overheid.nl/owms/terms/" xmlns:overheidop="http://standaarden.overheid.nl/product/terms/" xmlns:overheidvb="http://standaarden.overheid.nl/vb/terms">
<test>Hello world!</test>
<numberOfRecords>41</numberOfRecords>
<besluit>
<test2>Hello World again!</test2>
<titel>Provincie Groningen: verkeersbesluit nieuwe situatie parallelweg langs N964 tussen Winschoten en Scheemda.</titel>
<locatie>264455 576268$%$Oldambt</locatie>
</besluit>
<besluit>
<test2>Hello World again!</test2>
<titel>Provincie Groningen: verkeersbesluit nieuwe situatie N366, Westerstraat en A.G. Wildervanckweg in Ter Apel</titel>
<locatie>266425 544276$%$Vlagtwedde<</locatie>
</besluit>
...
</verkeersbesluiten>
有人可以指出我做错了吗?
威利
=============================================== ===========================
正如@halfbit建议的那样,我已经将命名空间srw和sru添加到我的XSL文件中:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xmlns:srw="http://www.loc.gov/zing/srw/" xmlns:sru="http://standaarden.overheid.nl/sru/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:overheid="http://standaarden.overheid.nl/owms/terms/" xmlns:overheidop="http://standaarden.overheid.nl/product/terms/" xmlns:overheidvb="http://standaarden.overheid.nl/vb/terms">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<verkeersbesluiten>
<test>Hello world!</test>
<numberOfRecords><xsl:value-of select="srw:searchRetrieveResponse/srw:numberOfRecords"/></numberOfRecords>
<xsl:for-each select="srw:searchRetrieveResponse/srw:records/srw:record/sru:gzd">
<besluit>
<test2>Hello world again!</test2>
</besluit>
</xsl:for-each>
</verkeersbesluiten>
</xsl:template>
</xsl:stylesheet>
这导致:
<?xml version="1.0" encoding="UTF-8"?>
<verkeersbesluiten xmlns:srw="http://www.loc.gov/zing/srw/" xmlns:sru="http://standaarden.overheid.nl/sru/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:overheid="http://standaarden.overheid.nl/owms/terms/" xmlns:overheidop="http://standaarden.overheid.nl/product/terms/" xmlns:overheidvb="http://standaarden.overheid.nl/vb/terms">
<test>Hello world!</test>
<numberOfRecords>41</numberOfRecords>
<besluit>
<test2>Hello world again!</test2>
</besluit>
<besluit>
<test2>Hello world again!</test2>
</besluit>
...
</besluiten>
这看起来不错。但是,当我扩展xsl:for-each子句时出现问题:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xmlns:srw="http://www.loc.gov/zing/srw/" xmlns:sru="http://standaarden.overheid.nl/sru/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:overheid="http://standaarden.overheid.nl/owms/terms/" xmlns:overheidop="http://standaarden.overheid.nl/product/terms/" xmlns:overheidvb="http://standaarden.overheid.nl/vb/terms">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<verkeersbesluiten>
<test>Hello world!</test>
<numberOfRecords><xsl:value-of select="srw:searchRetrieveResponse/srw:numberOfRecords"/></numberOfRecords>
<xsl:for-each select="srw:searchRetrieveResponse/srw:records/srw:record/sru:gzd">
<besluit>
<test2>Hello world again!</test2>
</besluit>
</xsl:for-each>
</verkeersbesluiten>
</xsl:template>
</xsl:stylesheet>
这导致:
<?xml version="1.0" encoding="UTF-8"?>
<verkeersbesluiten xmlns:srw="http://www.loc.gov/zing/srw/" xmlns:sru="http://standaarden.overheid.nl/sru/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:overheid="http://standaarden.overheid.nl/owms/terms/" xmlns:overheidop="http://standaarden.overheid.nl/product/terms/" xmlns:overheidvb="http://standaarden.overheid.nl/vb/terms">
<test>Hello world!</test>
<numberOfRecords>41</numberOfRecords>
</verkeersbesluiten>
我无法理解这一点。我做错了什么?
答案 0 :(得分:0)
以下适用于我:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:srw="http://www.loc.gov/zing/srw/"
xmlns:sru="http://standaarden.overheid.nl/sru"
xmlns:dcterms="http://purl.org/dc/terms/"
xmlns:overheid="http://standaarden.overheid.nl/owms/terms/"
xmlns:overheidop="http://standaarden.overheid.nl/product/terms/"
xmlns:overheidvb="http://standaarden.overheid.nl/vb/terms">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<verkeersbesluiten>
<test>Hello world!</test>
<numberOfRecords><xsl:value-of select="srw:searchRetrieveResponse/srw:numberOfRecords"/></numberOfRecords>
<xsl:for-each select="srw:searchRetrieveResponse/srw:records/srw:record/srw:recordData/sru:gzd/sru:originalData/overheidop:meta/overheidop:owmskern">
<besluit>
<test2>Hello world again!</test2>
<titel><xsl:value-of select="dcterms:title"/></titel>
<locatie><xsl:value-of select="dcterms:spatial"/></locatie>
</besluit>
</xsl:for-each>
</verkeersbesluiten>
</xsl:template>
</xsl:stylesheet>
它与您最新的XSL
不同sru
命名空间(它没有尾部斜杠 - 每个字符都很重要)srw:recordData
之前丢失的sru:gzd
。 BTW:如果XML输入的结构允许(预期每owmskern
只有一个record
),您可以将for-each
缩短为
<xsl:for-each select="srw:searchRetrieveResponse//overheidop:owmskern">
这可能会稍微慢些但更具可读性 - 正如您所经历的那样 - 写入/维护的错误更少。
关闭记录:在XSLT中,有些人不希望使用for-each
来遍历输入XML,因为这是XSLT处理器正在做的事情,而是编写多个更简单,更集中的模板,如此:
<!-- only traverse, do not copy anything by default -->
<xsl:template match="@*|node()">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="srw:searchRetrieveResponse">
<verkeersbesluiten>
<test>Hello world!</test>
<numberOfRecords><xsl:value-of select="srw:numberOfRecords"/></numberOfRecords>
<xsl:apply-templates/>
</verkeersbesluiten>
</xsl:template>
<xsl:template match="overheidop:owmskern">
<besluit>
<test2>Hello world again!</test2>
<titel><xsl:value-of select="dcterms:title"/></titel>
<locatie><xsl:value-of select="dcterms:spatial"/></locatie>
</besluit>
</xsl:template>