0

在我上一篇文章中 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和值为“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 元素时才显示该元素。

任何和所有的帮助将不胜感激。

4

1 回答 1

1

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

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

实际上,您可以将其添加到data-value上的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-”开头的元素。

于 2013-09-22T10:08:03.040 回答