我正在尝试使用xml
在key
中搜索值,但我没有得到预期的结果
这是我的代码
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>
答案 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>