XSL变量,其中元素为null或不存在

时间:2015-04-28 09:09:00

标签: xml variables xslt

请原谅任何糟糕的代码或可怕的语言!

我的XML包含其中包含产品级元素的组级元素,请参阅下面的示例XML:

<group id="392483" subtype="CMS Item Group" created="27/01/14" modified="15/10/14">
<attribute definition_id="23" modified="10/02/14" is_name="true" is_identifier="true" scope="global" type="text">
<data language="English" label="CMS Item Group Name">A4 96 PAGE EXERCISE BOOKS - Clearance. Now X coded Feb14</data>
</attribute>

<attribute definition_id="606" modified="25/09/14" scope="global" type="text">
<data language="English" label="Newweb: Config Group Att">Colour_132|Margin_150|Ruling_151</data>
</attribute>


<product id="93254" subtype="CMS Product" created="28/07/08" modified="16/04/15">
<attribute definition_id="26" modified="28/07/08" is_name="true" is_identifier="true" scope="global" type="text">
<data language="English" label="CMS Product Name">000854</data>
</attribute>

<attribute definition_id="132" modified="02/08/11" scope="global" type="text">
<data language="English" label="Colour">Red</data>
</attribute>

</product>
</group>

我的目标是从group元素中获取“Newweb:Config Group Att”值,并查询product元素以查看它是否包含此特定属性的值。例如。在上面的示例中,产品代码000854的颜色为“红色”。

Newweb属性的语法是“attributename_id” - 所有属性ID的长度都是3位数。

到目前为止,我有以下XSL为Newweb属性创建变量,删除任何alpha文本并将剩余的字符串拆分为3位数值。

然后,我需要查询product元素,以确定变量中存储的属性ID丢失或不存在的位置。

(我只关心有多个子产品元素的群组)

XSL:

<xsl:template match="product[@subtype = 'CMS Product']">

<xsl:variable name="newweb" select="../attribute/data[@label='Newweb: Config Group Att']" />
 <xsl:variable name="replacetext" select="replace($newweb, '[^0-9]', '')" />
  <xsl:variable name="first" select="substring($replacetext, 0, 4)" />
   <xsl:variable name="second" select="substring($replacetext, 4, 3)" />
     <xsl:variable name="third" select="substring($replacetext, 7, 3)" />
         <xsl:variable name="fourth" select="substring($replacetext, 10, 3)" />
            <xsl:variable name="prodcount" select="count(../product)" /> 

<xsl:if test="$prodcount > 1">

<xsl:for-each select="attribute">
<xsl:if test="@definition_id = 26"> 
<xsl:value-of select="normalize-space(data)" />
</xsl:if>
</xsl:for-each>
<xsl:text>&#x9;</xsl:text>

<xsl:for-each select="attribute">
<xsl:if test="(@definition_id = $first)"> 
<xsl:value-of select="normalize-space(data)" />
<xsl:text>&#x9;</xsl:text>
</xsl:if>
</xsl:for-each>

目前,这会返回产品代码以及变量$ first的值。虽然我很满意我所做的进展(昨天第一次使用变量) - 这并没有为我提供我需要的输出。

理想情况下,我想强调一下,对于缺少产品代码或者没有存储在$ first中的属性id的值,该属性是什么以及它缺少的事实。

如果我可以使用属性名称(Color而不是132)会很有帮助 - 虽然我意识到这意味着改变我的变量。如果这很容易,请指教!

提前致谢!

1 个答案:

答案 0 :(得分:1)

你能否简化这个问题?我几乎无法理解这一部分:

  

我的目标是采用&#34; Newweb:Config Group Att&#34;来自该组的价值   元素,并查询product元素以查看它是否包含   此特定属性的值。例如。在上面的例子中,   产品代码000854的颜色为&#34;红色&#34;。

如果您将以下模板应用于产品:

<xsl:template match="product">
    <xsl:variable name="current-product" select="."/>
    <xsl:for-each select="tokenize(../attribute/data[@label='Newweb: Config Group Att'], '\|')">
        <param name="{substring-before(., '_')}">
            <xsl:value-of select="key('attr', substring-after(., '_'), $current-product)/data" />
        </param>
    </xsl:for-each>
</xsl:template>

将顶级键定义为:

<xsl:key name="attr" match="attribute" use="@definition_id" />

你会得到这样的结果:

<param name="Colour">Red</param>
<param name="Margin"/>
<param name="Ruling"/>

为了清晰起见,我使用了XML作为结果;您可以根据需要将其调整为文本格式。