Muenchian Grouping - 显示行数的二级基础

时间:2013-09-22 09:11:49

标签: xslt muenchian-grouping

在我上一篇文章的Tim的帮助下,我能够让Muenchian分组为我的测试xml / xsl工作。但是在使用我的实际xml时遇到了不同的情况,如下所示。输入xml看起来像是为了简单而减少了它。如您所见<name>Status</name> <value>Existing</value>,实际的xml中还有许多其他条目。

<message>
<requisition>
<data-values>
    <data-value multi-valued="false">
        <name>Test_Grid-1.Name</name> <value>1</value>
    </data-value>
    <data-value multi-valued="false">
        <name>Test_Grid-1.SupportType</name> <value>Monthly,Quarterly</value>
    </data-value>
    <data-value multi-valued="false">
        <name>Test_Grid-2.Name</name> <value>2</value>
    </data-value>
    <data-value multi-valued="false">
        <name>Test_Grid-2.SupportType</name> <value>Monthly</value>
    </data-value>
    <data-value multi-valued="false">
        <name>Status</name> <value>Existing</value>
    </data-value>
</data-values>
</requisition>
<agent-parameter multi-valued="false">
  <name>ActionType</name> <value>New</value>
</agent-parameter>
<agent-parameter multi-valued="false">
  <name>Dictionary</name> <value>Test_Grid</value>
</agent-parameter>
<agent-parameter multi-valued="false">
  <name>ActionName</name> <value>SupportData</value>
</agent-parameter>
</message>

我正在使用的XSL是:

<xsl:key name="record" match="data-value" use="substring-before(name, '.')" />

<xsl:template match="message">
  <record>
    <xsl:apply-templates select="//data-value[generate-id() = generate-id(key('record', substring-before(name, '.'))[1])]" mode="record" />
  </record>
</xsl:template>
<xsl:template match="data-value" mode="record">
<rowData>
  <name><xsl:value-of select="$ServiceItemName" /></name>
 <xsl:apply-templates select="key('record', substring-before(name, '.'))" />
</rowData>
</xsl:template>

<xsl:template match="data-value">
 <xsl:if test="starts-with(name,concat($Dictionary,'-'))">
   <rowAttribute name="{substring-after(name, '.')}"><xsl:value-of select="value" />   </rowAttribute>
 </xsl:if>
</xsl:template>

实际输入xml包含不同的数据值(Test_Grid-1或Test_Grid-2等除外)。在那种情况下,xsl将拉出所有这些元素并显示在内部。有没有办法我只能以“Test_Grid-”开头过滤值(我有一个名为Dictionary的agent-parameter,值为“Test_Grid”),而xsl只会拉取那些名字所在的数据值以concat($Dictionary,'-')开头。我尝试了类似下面的内容

       <xsl:template match="data-value">
    <xsl:if test="starts-with(name,concat($Dictionary,'-'))">
        <rowAttribute name="{substring-after(name, '.')}"><xsl:value-of select="value" /></rowAttribute>
    </xsl:if>

但它在输出中显示空元素,如下图所示。

 <record>
            <name>SupportData</ext:name>
 </record>
 <record>
              <name>SupportData</name>
    <rowData>
              <rowAttribute name="Name">Record1</rowAttribute>
              <rowAttribute name="SupportType">Quarterly</rowAttribute>
    </rowData>        
 </record>

有没有办法只有当元素中包含一些rowData元素时才能显示元素。

非常感谢任何和所有帮助。

1 个答案:

答案 0 :(得分:1)

要忽略名称不以“Test_Grid-”开头的数据值元素,可以使用xpath函数“starts-with”。您可以向xpath表达式添加条件以过滤数据值元素

data-value[starts-with(name, 'Test_Grid-')]

您实际上可以将此添加到数据值上的 xsl:key 匹配,或者添加到 xsl:apply-templates 的位置选择它们。例如,你可以这样做:

<xsl:key name="record" match="data-value[starts-with(name, 'Test_Grid-')]" use="substring-before(name, '.')" />

或者,您也可以这样做

<xsl:apply-templates 
    select="requisition/data-values/data-value
       [starts-with(name, 'Test_Grid-')]
       [generate-id() = generate-id(key('record', substring-before(name, '.'))[1])]" 
    mode="record" />

将它作为密钥的一部分可能更有效。通过将其作为键的一部分,对不同元素的检查将仅考虑以“Test-Grid - ”开头的元素。