xsl:value-of和xsl:for-each在XSLT中被忽略

时间:2017-11-19 12:19:12

标签: xml xslt

我尝试使用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>

我无法理解这一点。我做错了什么?

1 个答案:

答案 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>