我有一个xml转换,它有一个年变量:
<xsl:key name="LUState" match="lookupTypes/LookupState/code" use="@id" />
<xsl:key name="LUZip" match="lookupTypes/LookupZipType/code" use="@id" />
和一些查找我需要使用的值的键:
<xsl:variable name="LookupLocation">
<xsl:choose>
<xsl:when test = "$rptYearVal = '2016'">
<xsl:text>lookupTypes/lookupData</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>lookupTypes</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable/>
<xsl:key name="LUState" match="$LookupLocation/LookupState/code" use="@id" />
现在我需要根据我设置的年变量指定密钥(特别是匹配)。因此,对于2016年,匹配需要添加一个节点:
匹配=&#34; lookupTypes / lookupData / LookupState /代码&#34;
我以为我可以使用条件,如下:
<body ng-controller="MainCtrl">
<legend>UI</legend>
<div>
<input type="checkbox" ng-model="checkbox" />
</div>
{{checkbox}}
{{message}}
但它会导致错误。
有人能用这段代码指出我正确的方向吗?
答案 0 :(得分:1)
有一种很好的技术可以实现动态确定密钥。
鉴于此源XML文档(OP没有提供):
<t>
<year>2016</year>
<a>
<n id="1">an1</n>
<n id="2">an2</n>
<n id="3">an3</n>
<sub>
<n id="1">aSubn1</n>
<n id="2">aSubn2</n>
<n id="3">aSubn3</n>
</sub>
</a>
</t>
以及此XSLT 1.0转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kInA" match="a/n" use="@id"/>
<xsl:key name="kInASub" match="a/sub/n" use="@id"/>
<xsl:variable name="vStylesheet" select="document('')"/>
<xsl:variable name="vYear" select="/*/year"/>
<xsl:template match="/">
<xsl:variable name="vKeyName" select=
"$vStylesheet/*/xsl:key[$vYear = 2016 and @name='kInA']/@name
| $vStylesheet/*/xsl:key[not($vYear = 2016) and @name='kInASub']/@name "/>
<xsl:copy-of select="key($vKeyName, '2')"/>
</xsl:template>
</xsl:stylesheet>
生成了想要的结果(2016年):
<n id="2">an2</n>
只需替换上述XML文档中的<year>
元素,使其字符串值不是&nbsp;&#39; 2016&#39; - 例如:
<year>2017</year>
再次运行转换产生想要的结果,这次:
<n id="2">aSubn2</n>
你应该从中得到什么:
<强>记住强>:
可以使用变量作为key()
函数的第一个参数
可以将键名作为参数传递给任何模板(以及XSLT 2.0中的xsl:function
)