2016-01-11 4 views
1

Я пытаюсь получить самые последние налоговые данные для местности. Я использую следующий входной и XSLT преобразование:XSLT Сортировка по дате Не работает

<?xml version='1.0' encoding='UTF-8'?> 
 
<root> 
 
    <row> 
 
     <Applies_To>Abbott Twp (Pennsylvania:Potter)</Applies_To> 
 
     <Tax_Code>42530035</Tax_Code> 
 
     <Tax>Local City Withholding (Resident)</Tax> 
 
     <Start_Date>2011-07-01</Start_Date> 
 
     <Tax_Rate>0.005</Tax_Rate> 
 
    </row> 
 
    <row> 
 
     <Applies_To>Abbott Twp (Pennsylvania:Potter)</Applies_To> 
 
     <Tax_Code>42530035</Tax_Code> 
 
     <Tax>Local City Withholding (Resident)</Tax> 
 
     <Start_Date>2015-01-01</Start_Date> 
 
     <Tax_Rate>0.099</Tax_Rate> 
 
    </row> 
 
    <row> 
 
     <Applies_To>Abbott Twp (Pennsylvania:Potter)</Applies_To> 
 
     <Tax_Code>42530035</Tax_Code> 
 
     <Tax>Local City Withholding (Work)</Tax> 
 
     <Start_Date>2011-07-01</Start_Date> 
 
     <Tax_Rate>0</Tax_Rate> 
 
    </row> 
 
    <row> 
 
     <Applies_To>Abbottstown Boro (Pennsylvania:Adams)</Applies_To> 
 
     <Tax_Code>42010033</Tax_Code> 
 
     <Tax>Local City Withholding (Resident)</Tax> 
 
     <Start_Date>2011-07-01</Start_Date> 
 
     <Tax_Rate>0.005</Tax_Rate> 
 
    </row> 
 
    <row> 
 
     <Applies_To>Abbottstown Boro (Pennsylvania:Adams)</Applies_To> 
 
     <Tax_Code>42010033</Tax_Code> 
 
     <Tax>Local City Withholding (Work)</Tax> 
 
     <Start_Date>2012-07-01</Start_Date> 
 
     <Tax_Rate>0.01</Tax_Rate> 
 
    </row> 
 
    <row> 
 
     <Applies_To>Abbottstown Boro (Pennsylvania:Adams)</Applies_To> 
 
     <Tax_Code>42010033</Tax_Code> 
 
     <Tax>xxxx</Tax> 
 
     <Start_Date>2012-07-01</Start_Date> 
 
     <Tax_Rate>0.01</Tax_Rate> 
 
     
 
    </row> 
 

 
</root>

XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
 
    <xsl:output indent="yes" method="xml"/> 
 

 
    <xsl:template match="/"> 
 
     <root> 
 
      <xsl:for-each-group select="*/row" 
 
       group-by="Tax_Code"> 
 
       <xsl:sort order="descending" select="Start_Date"/> 
 
       <row> 
 
        <Tax_Code> 
 
         <xsl:attribute name="Code" select="current-grouping-key()"/> 
 
          <xsl:for-each-group select="current-group()" group-by="Tax"> 
 
           <xsl:call-template name="Tax_Code"/> 
 
          </xsl:for-each-group> 
 
        </Tax_Code> 
 
       </row> 
 
      </xsl:for-each-group> 
 
     </root> 
 
    </xsl:template> 
 
    
 
    <xsl:template name="Tax_Code"> 
 
     <Tax_Rate> 
 
      <xsl:attribute name="taxtype"> 
 
       <xsl:value-of select="Tax"/> 
 
      </xsl:attribute> 
 
      <xsl:value-of select="Tax_Rate"/> 
 
     </Tax_Rate> 
 
     <date> 
 
      <xsl:value-of select="Start_Date"></xsl:value-of> 
 
     </date> 
 

 
    </xsl:template> 
 

 
</xsl:stylesheet>

Затем я получаю следующий результат:

<?xml version="1.0" encoding="UTF-8"?> 
 
<root xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
 
    <row> 
 
     <Tax_Code Code="42530035"> 
 
     <Tax_Rate taxtype="Local City Withholding (Resident)">0.005</Tax_Rate> 
 
     <date>2011-07-01</date> 
 
     <Tax_Rate taxtype="Local City Withholding (Work)">0</Tax_Rate> 
 
     <date>2011-07-01</date> 
 
     </Tax_Code> 
 
    </row> 
 
    <row> 
 
     <Tax_Code Code="42010033"> 
 
     <Tax_Rate taxtype="Local City Withholding (Resident)">0.005</Tax_Rate> 
 
     <date>2011-07-01</date> 
 
     <Tax_Rate taxtype="Local City Withholding (Work)">0.01</Tax_Rate> 
 
     <date>2012-07-01</date> 
 
     <Tax_Rate taxtype="xxxx">0.01</Tax_Rate> 
 
     <date>2012-07-01</date> 
 
     </Tax_Code> 
 
    </row> 
 
</root>

Как вы можете видеть, вывод не имеет самую последнюю ставку налога для налогового кода 42530035. Даже если я пытаюсь добавить позицию() = 1, я до сих пор не получают самый ввод. Я не могу найти объяснения, почему сортировка не работает.

ответ

2

Элементы в вашем самом внутреннем xsl:for-each-group возвращены в документе. Если вы хотите обработать первый отсортированный элемент, вы можете использовать xsl:for-each и xsl:sort в current-group() элементы, а затем обрабатывать только первый:

<xsl:for-each-group select="current-group()" group-by="Tax">       
    <xsl:for-each select="current-group()"> 
    <xsl:sort order="descending" select="Start_Date" /> 
    <xsl:if test="position() = 1"> 
     <xsl:apply-templates select="." mode="Tax_Code"/> 
    </xsl:if>  
    </xsl:for-each> 
</xsl:for-each-group> 

Полная таблица стилей:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output indent="yes" method="xml"/> 

    <xsl:template match="/"> 
     <root> 
      <xsl:for-each-group select="*/row" 
       group-by="Tax_Code"> 
       <xsl:sort order="descending" select="Start_Date"/> 
       <row> 
        <Tax_Code> 
         <xsl:attribute name="Code" select="current-grouping-key()"/> 
         <xsl:for-each-group select="current-group()" group-by="Tax"> 

          <xsl:for-each select="current-group()"> 
           <xsl:sort order="descending" select="Start_Date" /> 
           <xsl:if test="position() = 1"> 
            <xsl:apply-templates select="." mode="Tax_Code"/> 
           </xsl:if>  
          </xsl:for-each> 

         </xsl:for-each-group> 
        </Tax_Code> 
       </row> 
      </xsl:for-each-group> 
     </root> 
    </xsl:template> 

    <xsl:template name="Tax_Code" match="row" mode="Tax_Code"> 
     <Tax_Rate> 
      <xsl:attribute name="taxtype"> 
       <xsl:value-of select="Tax"/> 
      </xsl:attribute> 
      <xsl:value-of select="Tax_Rate"/> 
     </Tax_Rate> 
     <date> 
      <xsl:value-of select="Start_Date"/> 
     </date>  
    </xsl:template> 

</xsl:stylesheet> 
2

Использование

<date> 
     <xsl:value-of select="max(current-group()/xs:date(Start_Date))"></xsl:value-of> 
    </date> 

для вывода самой высокой даты в группе у вас есть. Порядок с xsl:sort, который вы использовали только во внешней группировке, и только для групп, во внутренней группе вы в настоящее время выдаете дату первого элемента в группе (в первоначальном порядке документа).

+0

большое предложение - но я «Мне нравится« Tax_Rate », чтобы быть последним. Если я переведу свой оператор сортировки в мою внутреннюю группу, я все равно получаю тот же результат (где мой вывод, похоже, основан на первоначальном порядке документа). В идеале мой выпуск должен сообщать «0.099» в качестве ставки налога для самого первого Tax_Rate на выходе. Имеет ли это смысл? – hopkinch

+0

Думаю, я понял! Ваш комментарий к сортировке, сортировка самой группы, а не содержимого в группе, вызвала меня. Я добавил для каждой инструкции внутри внутренней группы для каждой группы и переместил мой вид туда. Оттуда я могу включить только самые последние, имея . – hopkinch

Смежные вопросы