如何在xslt中使用key?

时间:2017-03-05 03:59:31

标签: jquery xml xslt xslt-1.0

我正在尝试使用xmlkey中搜索值,但我没有得到预期的结果 这是我的代码 http://xsltransform.net/6rewNyZ/1

  <xsl:key name="mid" match="parent_id" use="@id"/>
    <xsl:template match="/">
      <hmtl>
    <xsl:variable name="msid" select="'54'"/>
    <xsl:variable name="msids_map">
        <parent_id id="34">
          <childid>1</childid>
          <childid>2</childid>
        </parent_id>
        <parent_id id="54">
          <childid>3</childid>
          <childid>4</childid>
        </parent_id>
    </xsl:variable>
       <xsl:variable name ="abc" select="ext:node-set(msids_map)">
       </xsl:variable>
       <xsl:variable name="getValue" select=
        "key('mid', $abc)"/>

        <xsl:value-of select="$getValue"/> 

预期输出

<parent_id id="54">
              <childid>3</childid>
              <childid>4</childid>
            </parent_id>

3 个答案:

答案 0 :(得分:0)

您可以在代码中进行编辑。

<?xml version="1.0" encoding="UTF-8" ?>
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
     xmlns:ext="http://exslt.org/common">

        <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
        <xsl:key name="mid" match="parent_id" use="@id"/>
        <xsl:template match="/">
          <hmtl>
        <xsl:variable name="msid" select="'54'"/>
        <xsl:variable name="msids_map">
            <parent_id id="34">
              <childid>1</childid>
              <childid>2</childid>
            </parent_id>
            <parent_id id="54">
              <childid>3</childid>
              <childid>4</childid>
            </parent_id>
        </xsl:variable>
           <xsl:variable name ="abc" select="$msids_map" as="node()">
           </xsl:variable>
            <xsl:copy-of select="$abc/key('mid', $msid)"/>
          </hmtl>
        </xsl:template>
    </xsl:transform>

<强>输出

   <parent_id id="54">
      <childid>3</childid>
      <childid>4</childid>
   </parent_id>

答案 1 :(得分:0)

1.0中的关键功能适用于上下文节点。因此,要在变量上使用键,必须以某种方式将其作为上下文节点。适用于1.0的另一种方法是根本不使用密钥。只需使用变量和过滤器即可。你有什么紧迫的理由使用钥匙吗?你在寻找独特性吗?这也可以通过过滤器来完成。

 <!-- Add $ before variable to fix bug. -->
  <xsl:variable name ="abc" select="msxsl:node-set($msids_map)">

     .....

  <xsl:variable name="getValue">
    <xsl:copy-of select="$abc/parent_id[@id=$msid]"/>
  </xsl:variable> 

答案 2 :(得分:0)

您有一些小的语法问题,以及一个主要的上下文问题。 Keys在当前文档的上下文中运行 - 在您的示例中是输入XML文档。为了获得操作变量的键(它是自己的文档),必须首先切换上下文 - 例如,在调用键之前使用xsl:for-each select="$abc"

这是一个完整的示例(也纠正了语法错误):

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
extension-element-prefixes="ext">
<xsl:output method="html" encoding="UTF-8"/>

<xsl:key name="mid" match="parent_id" use="@id"/>

<xsl:template match="/">
    <hmtl>
        <xsl:variable name="msid" select="'54'"/>
        <xsl:variable name="msids_map">
            <parent_id id="34">
                <childid>1</childid>
                <childid>2</childid>
            </parent_id>
            <parent_id id="54">
                <childid>3</childid>
                <childid>4</childid>
            </parent_id>
        </xsl:variable>
        <xsl:variable name ="abc" select="ext:node-set($msids_map)"/>
        <xsl:for-each select="$abc">
            <xsl:variable name="getValue" select="key('mid', $msid)"/>
            <xsl:copy-of select="$getValue"/>
        </xsl:for-each>
       </hmtl>
</xsl:template>

</xsl:stylesheet>

演示:http://xsltransform.net/6rewNyZ/4