简单的问题,但很难解释......
我在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稍后使用输出来验证这种不当行为
答案 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>