在我上一篇文章的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元素时才能显示元素。
非常感谢任何和所有帮助。
答案 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 - ”开头的元素。