对一个属性进行排序会从xml文件中删除另一个属性

时间:2014-08-24 19:21:50

标签: xml xslt

我想根据count属性对xml数据进行排序,并选择前100个值。

我写过这个xsl。但它正在从指标标签中删除@code,这是进一步处理所必需的。

<xsl:template match="node()|@*">
  <xsl:if test="//field
                [count(indicators/indicator/values) &lt; '100' 
                or 
                count(subfields/subfield/position/values) &lt; '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属性,该属性在从指标标记排序后删除。

1 个答案:

答案 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>

样式表假定除valuesindicator内的元素之外还有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个元素来测试它们是否被发送到输出。