根据条件使xml键不同

时间:2017-01-11 03:48:31

标签: xml xslt conditional transform

我有一个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}}

但它会导致错误。

有人能用这段代码指出我正确的方向吗?

1 个答案:

答案 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>

你应该从中得到什么:

<强>记住

  1. 可以使用变量作为key()函数的第一个参数

  2. 可以将键名作为参数传递给任何模板(以及XSLT 2.0中的xsl:function