xslt从变量中选择属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xslt从变量中选择属性相关的知识,希望对你有一定的参考价值。

我和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>

这不起作用。有谁知道我怎么能得到它?

答案

我希望我理解正确:

这里的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>
另一答案

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是一个静态错误,它不是一个有效的表达式。这就是为什么我要求你告诉我们它是如何失败的。)

以上是关于xslt从变量中选择属性的主要内容,如果未能解决你的问题,请参考以下文章

如何为 XSLT 代码片段配置 CruiseControl 的 C# 版本?

从 C# 代码重命名 XSLT 属性值

在 XSLT 中,如何使用存在多个相同节点的 ID 从节点中选择一个值?

如何使用 xslt 获取 XML 的属性值和代码作为 html 的值

XSLT 中的条件变量选择

将XSLT属性解析为一个数组。