【问题标题】:xslt select attribute from variablexslt 从变量中选择属性
【发布时间】:2018-03-02 06:32:57
【问题描述】:

我使用 xslt,但遇到了问题(我是新手)。我在一个名为 gmlMember 的变量中有一些 xml,还有一个包含名为 var_FeatureClassName 的名称的变量,其中包含“BES_VANDLOEB”

xml 看起来像这样(包含在 gmlMember 中):

<dmp:BES_VANDLOEB gml:id="BES_VANDLOEB.52626" xmlns:gml="http://www.opengis.net/gml" xmlns:dmp="https://arealinformation.miljoeportal.dk/gis/services/DAIdb/MapServer/WFSServer">
   <dmp:OBJECTID>94808</dmp:OBJECTID>
   <dmp:Temakode>2014</dmp:Temakode>
   <dmp:Temanavn>Beskyttede vandløb</dmp:Temanavn>
   <dmp:Objekt_id>{D2BDC519-5374-11E2-B629-00155D01E765}</dmp:Objekt_id>
   <dmp:Version_id>{F744FAB7-04A4-4DAE-8A03-A765D86CEA52}</dmp:Version_id>
   <dmp:Systid_fra>2006-12-31T23:59:00</dmp:Systid_fra>
   <dmp:Oprettet>2006-12-31T23:59:00</dmp:Oprettet>
</dmp:BES_VANDLOEB>

我需要获取 gml:id="BES_VANDLOEB.52626"

我尝试了以下各种方法:

  <xsl:variable name="gmlId">
    <xsl:value-of select="$gmlMember/$var_FeatureClassName/@gml:id"/>
  </xsl:variable>

这行不通。有谁知道我怎样才能得到它?

【问题讨论】:

  • 别告诉我们有什么东西没用。告诉我们它是如何失败的。故障症状是任何诊断过程的起点。
  • 好吧。我的变量是空的。

标签: xml xslt


【解决方案1】:

希望我理解正确:

这里是 xslt 示例: https://xsltfiddle.liberty-development.net/gWcDMer/3

Xslt 代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:gml="http://www.opengis.net/gml" xmlns:dmp="https://arealinformation.miljoeportal.dk/gis/services/DAIdb/MapServer/WFSServer">
    <xsl:template match="/">
        <xsl:variable name="gmlMember" select="."/>
        <xsl:variable name="var_FeatureClassName" select="'dmp:BES_VANDLOEB'" />
        <xsl:variable name="gmlId">
            <xsl:value-of select="$gmlMember//*[name()=$var_FeatureClassName]/@gml:id"/>
        </xsl:variable>

        <id>
            <xsl:value-of select="$gmlId"/>
        </id>
    </xsl:template>
</xsl:stylesheet>

Xml 输入:

<root>
    <dmp:BES_VANDLOEB gml:id="BES_VANDLOEB.52626" xmlns:gml="http://www.opengis.net/gml" xmlns:dmp="https://arealinformation.miljoeportal.dk/gis/services/DAIdb/MapServer/WFSServer">
        <dmp:OBJECTID>94808</dmp:OBJECTID>
        <dmp:Temakode>2014</dmp:Temakode>
        <dmp:Temanavn>Beskyttede vandløb</dmp:Temanavn>
        <dmp:Objekt_id>{D2BDC519-5374-11E2-B629-00155D01E765}</dmp:Objekt_id>
        <dmp:Version_id>{F744FAB7-04A4-4DAE-8A03-A765D86CEA52}</dmp:Version_id>
        <dmp:Systid_fra>2006-12-31T23:59:00</dmp:Systid_fra>
        <dmp:Oprettet>2006-12-31T23:59:00</dmp:Oprettet>
    </dmp:BES_VANDLOEB>
    <dmp:SOME_VANDLOEB gml:id="BES2126" xmlns:gml="http://www.opengis.net/gml" xmlns:dmp="https://arealinformation.miljoeportal.dk/gis/services/DAIdb/MapServer/WFSServer">
        <dmp:OBJECTID>94808</dmp:OBJECTID>
        <dmp:Temakode>2014</dmp:Temakode>
        <dmp:Temanavn>Beskyttede vandløb</dmp:Temanavn>
        <dmp:Objekt_id>{D2BDC519-5374-11E2-B629-00155D01E765}</dmp:Objekt_id>
        <dmp:Version_id>{F744FAB7-04A4-4DAE-8A03-A765D86CEA52}</dmp:Version_id>
        <dmp:Systid_fra>2006-12-31T23:59:00</dmp:Systid_fra>
        <dmp:Oprettet>2006-12-31T23:59:00</dmp:Oprettet>
    </dmp:SOME_VANDLOEB>
</root>

输出:

<id xmlns:gml="http://www.opengis.net/gml" xmlns:dmp="https://arealinformation.miljoeportal.dk/gis/services/DAIdb/MapServer/WFSServer">BES_VANDLOEB.52626</id>

【讨论】:

  • 嗯。我的 var_FeatureClassName 不包含“dmp”,只有“BES_VANDLOEB”。也许我可以添加 dmp,我不知道。
  • 那么你可以用local-name()代替name()。这将返回没有命名空间的元素名称。
  • 我看到你的例子有效。然而我的是空的。奇数
  • 我需要更多信息。有例子的链接吗?
  • 我知道它是什么。我的 dmp:BES_VANDLOEB 是我的根元素。所以我做了 $gmlMember[name()=$var_FeatureClassName]/@gml:id,现在我有了值。
【解决方案2】:

XPath 中的变量表示一个值,而不是表达式的片段(它不是宏语言)。所以$a/$b 的意思是“对于$a 中的每个值,返回$b 的值”。因此,如果$a 包含 6 个节点,而$b 包含字符串 'className',那么结果将是一个包含 6 次出现的字符串 'className' 的序列。如果您希望结果与表达式 $a/className 的结果等价,那么您应该编写 $a/*[name()='className'](或将命名空间考虑在内的一些改进)。

(这个解释适用于 XSLT 2.0/3.0。在 XSLT 1.0 中,写 $a/$b 是一个静态错误,它不是一个有效的表达式。这就是为什么我要求你告诉我们它是如何失败的。)

【讨论】:

  • 感谢您的澄清。我让它与给出的例子一起工作。但现在我知道它是如何工作的了。
猜你喜欢
  • 1970-01-01
  • 2017-08-09
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多