请原谅任何糟糕的代码或可怕的语言!
我的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>	</xsl:text>
<xsl:for-each select="attribute">
<xsl:if test="(@definition_id = $first)">
<xsl:value-of select="normalize-space(data)" />
<xsl:text>	</xsl:text>
</xsl:if>
</xsl:for-each>
目前,这会返回产品代码以及变量$ first的值。虽然我很满意我所做的进展(昨天第一次使用变量) - 这并没有为我提供我需要的输出。
理想情况下,我想强调一下,对于缺少产品代码或者没有存储在$ first中的属性id的值,该属性是什么以及它缺少的事实。
如果我可以使用属性名称(Color而不是132)会很有帮助 - 虽然我意识到这意味着改变我的变量。如果这很容易,请指教!
提前致谢!
麦
答案 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作为结果;您可以根据需要将其调整为文本格式。