XSL转换与XPATH字符串比较中的变量

时间:2014-02-13 12:29:45

标签: xml xslt xpath

简单的问题,但很难解释......

我在xsl转换中的节点内。该节点有两个信息。一个国家和一年 此节点之外是许多具有相同模式的其他节点。我希望与现在的国家相处多年。

以下示例可能包含拼写错误:

<prices>
    <price ta:id="RPMA12875162">
        <context>
            <country-ext>US</country-ext>
            <year>2016</year>
        </context>
        <price>
            <value>10</value>
        </price>
    </price>
</prices>
<prices>
    <price ta:id="RPMA12875163">
        <context> <!-- lets say the transformation is here -->
            <country-ext>US</country-ext>
            <year>2014</year>
        </context>
        <price>
            <value>10</value>
        </price>
    </price>
    <price ta:id="RPMA12875162">
        <context>
            <country-ext>DE</country-ext>
            <year>2013</year>
        </context>
        <price>
            <value>9</value>
        </price>
    </price>
    <price ta:id="RPMA12875163">
        <context>
            <country-ext>DE</country-ext>
            <year>2014</year>
        </context>
        <price>
            <value>10</value>
        </price>
    </price>
    <price ta:id="RPMA12875164">
        <context>
            <country-ext>DE</country-ext>
            <year>2015</year>
        </context>
        <price>
            <value>11</value>
        </price>
    </price>
</prices>

关注已清理的xsl

<xsl:template match="context">
    <DimensionProperties>
        <xsl:if test="country-ext and year" >
            <xsl:variable name="currentCountryExt1" select="concat(string(country-ext/text()), '')"/>
            <xsl:variable name="currentCountryExt2" select="'US'"/>

            <xsl:variable name="yearOfEepartPrices1" select="../../price/context[string(country-ext/text()) = $currentCountryExt1]/year"/>
            <xsl:variable name="yearOfEepartPrices2" select="../../price/context[string(country-ext/text()) = $currentCountryExt2]/year"/>
        </xsl:if>
    </DimensionProperties>
</xsl:template>

虽然硬编码变量currentCountryExt2有效,但currentCountryExt1却没有。调试时我可以看到1和2是xs:字符串,值为US。 我尝试使用contains()或没有concat(string())之类的函数。每次我得到相同的结果:没有。

yearOfEepartPrices1不起作用

yearOfEepartPrices2的作品

任何想法?


回答评论:

我与''结果'因为我在一个论坛中发现了一个提示,就像我一样有人遇到同样的问题。他用这个小小的“技巧”解决了这个问题。

我使用oXygen作为调试器,xsl稍后使用输出来验证这种不当行为

1 个答案:

答案 0 :(得分:0)

你让事情变得比他们需要的更复杂。对于您在问题中给出的XML结构,以下内容应该可以正常工作:

<xsl:template match="context">
    <DimensionProperties>
        <xsl:if test="country-ext and year" >
            <xsl:variable name="yearOfEepartPrices"
                  select="../../price/context[
                         country-ext = current()/country-ext]/year"/>
        </xsl:if>
    </DimensionProperties>
</xsl:template>

你应该避免使用text(),除非你真的需要单独处理每个单独的文本节点 - 如果你想要的是给定元素的完整字符串值,那么只需选择元素而不是它的文本节点集孩子。


编辑:原始问题并不清楚,有几个单独的prices节点,如果您想在整个文档中找到所有匹配的year元素,则以下建议是有意义的。

  

我希望与现在的国家一起度过所有年份。

最简单的方法是定义一个键。

<xsl:key name="yearByCountry" match="year" use="../country-ext" />

然后您可以使用

提取与特定国家/地区匹配的所有year元素
key('yearByCountry', $theCountryCode)

例如:

<xsl:template match="context">
    <DimensionProperties>
        <xsl:if test="country-ext and year" >
            <xsl:variable name="yearOfEepartPrices"
                     select="key('yearByCountry', country-ext)"/>
        </xsl:if>
    </DimensionProperties>
</xsl:template>

或者让密钥返回price元素

可能更有意义
<xsl:key name="priceByCountry" match="price" use="context/country-ext" />

<xsl:template match="context">
    <DimensionProperties>
        <xsl:if test="country-ext and year" >
            <xsl:variable name="yearOfEepartPrices"
                     select="key('priceByCountry', country-ext)/context/year"/>
        </xsl:if>
    </DimensionProperties>
</xsl:template>