我想根据count属性对xml数据进行排序,并选择前100个值。
我写过这个xsl。但它正在从指标标签中删除@code,这是进一步处理所必需的。
<xsl:template match="node()|@*">
<xsl:if test="//field
[count(indicators/indicator/values) < '100'
or
count(subfields/subfield/position/values) < '100'
]">
<xsl:copy>
<xsl:apply-templates select="node()|@*">
<xsl:sort select="@count"
data-type="number"
order="descending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:if>
</xsl:template>
请帮助查找100个最高值和@code属性,该属性在从指标标记排序后删除。
答案 0 :(得分:2)
不要修改身份转换。最好保留该模板,并在需要时编写其他模板:一个匹配position
元素(以便能够对其子元素进行排序):
<xsl:template match="position">
另一个匹配values
元素,如果它们的位置超过100:
<xsl:template match="position/values[position() gt 100]"/>
我认为通过“排序XML数据”,您的意思是对values
内的position
元素进行排序。另外,我认为通过“选择前100个值”,您的意思是选择values
中的前100个position
元素。
样式表(XSLT 2.0)
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="position">
<xsl:copy>
<xsl:apply-templates select="node()|@*">
<xsl:sort select="@count" data-type="number" order="descending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="indicator/values[position() gt 100]|position/values[position() gt 100]"/>
</xsl:transform>
样式表假定除values
和indicator
内的元素之外还有position
个元素。如果不是这种情况,可以使用以下模板:
<xsl:template match="values[position() gt 100]"/>
XML输出
<?xml version="1.0" encoding="UTF-8"?>
<field count="3159" tag="461">
<indicators>
<indicator code="1">
<values count="3159" value=" "/>
</indicator>
<indicator code="2">
<values count="3159" value="1"/>
</indicator>
</indicators>
<subfields>
<subfield code="3" count="3497">
<position>
<values count="32" value="200000190420020805152452"/>
<values count="28" value="200000000220020805151840"/>
<values count="9" value="200000190720020805152453"/>
<values count="8" value="200000190520020805152453"/>
<values count="6" value="200000190820020805152454"/>
<values count="3" value="200000190920020805152454"/>
<values count="1" value="200000000120020805151840"/>
<values count="1" value="200000190620020805152453"/>
</position>
</subfield>
</subfields>
</field>
注意:更合理的输入XML当然会包含100多个values
个元素来测试它们是否被发送到输出。