如何根据xsl中的条件进行计算

时间:2017-06-23 15:30:38

标签: xml xslt

我的xml以下。

$(document).ready(function() {
   /* activate jquery isotope */
   var $container = $('#posts').isotope({
        isFitWidth: true,
        itemSelector : '.item',
    });

    $container.isotope({ filter: '*' });

    // filter items on button click
    $('#filters').on( 'click', 'button', function() {
        var filterValue = $(this).attr('data-filter');
        $container.isotope({ filter: filterValue });
    });

});

我正在努力实现以下输出。我认为,逻辑将有两个变量,并且对于每个出现,子串最后一部分并指定min和max,最后concat前3部分+(点)+ min +( - )+ max。有任何建议,如何为它编写xsl?

<?xml version="1.0" encoding="UTF-8"?>
<Data>
    <ip_address action="del">192.100.200.323</ip_address>
    <ip_address action="del">192.100.200.324</ip_address>
    <ip_address action="del">192.100.200.325</ip_address>
    <ip_address action="del">192.100.200.326</ip_address>
    <ip_address action="del">192.100.200.327</ip_address>
</Data>

1 个答案:

答案 0 :(得分:0)

这是一个基于以下假设的选项:

  • 您可以使用XSLT 2.0
  • 评论中我的问题的答案都是“是”。

如果缺少范围内的ip,我也会假设输出应该是什么样的。这应该至少是一个开始。

XML输入

<Data>
    <ip_address action="del">192.100.200.323</ip_address>
    <ip_address action="del">192.100.200.324</ip_address>
    <ip_address action="del">192.100.200.325</ip_address>
    <ip_address action="del">192.100.200.326</ip_address>
    <ip_address action="del">192.100.200.327</ip_address>
</Data>

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
  </xsl:template>

  <xsl:template match="Data">
    <xsl:copy>
      <xsl:for-each-group select="ip_address" 
        group-by="replace(normalize-space(),'\d+$','')">
        <xsl:variable name="base" select="current-grouping-key()"/>
        <xsl:variable name="no-base">
            <xsl:for-each select="current-group()">
              <ip>
                <xsl:value-of 
                  select="replace(normalize-space(),current-grouping-key(),'')"/>
              </ip>
            </xsl:for-each>
        </xsl:variable>
        <xsl:for-each-group select="$no-base/ip"
          group-starting-with="ip[preceding-sibling::ip[1] + 1 != .]">
          <ip_address>
            <xsl:value-of
              select="if (current-group()[1]=current-group()[last()]) then 
              concat($base,current-group()[1]) else 
              concat($base,current-group()[1],'-',current-group()[last()])"
            />
          </ip_address>
        </xsl:for-each-group>
      </xsl:for-each-group>      
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

<强>输出

<Data>
   <ip_address>192.100.200.323-327</ip_address>
</Data>

如果:

<ip_address action="del">192.100.200.326</ip_address>

从输入中删除,输出为:

<Data>
   <ip_address>192.100.200.323-325</ip_address>
   <ip_address>192.100.200.327</ip_address>
</Data>