Как упорядочить число в XSLT 2.0? - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть следующий ввод XML

<?xml version="1.0" encoding="UTF-8"?>
<Workers>
<Worker>
    <id>1234</id>
    <loc>New York</loc>
    <Days>1</Days>
    <StartDate>2019-01-26</StartDate>
</Worker>
<Worker>
    <id>2345</id>
    <loc>Boston</loc>
    <Batch>A</Batch>
    <Days>3</Days>
    <Units>2</Units>
    <StartDate>2019-02-01</StartDate>
</Worker>
</Workers>

Мой код выглядит следующим образом

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result- 
prefixes="#all">
<xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>

 <xsl:template match="Worker[Batch]">
 <xsl:variable name="currElem" select="."/>
 <xsl:for-each select="1 to Days">
  <xsl:apply-templates select="$currElem" mode="replicate">
    <xsl:with-param name="dayNo" select="."/>
  </xsl:apply-templates>
</xsl:for-each>
<xsl:for-each select="1 to Units">
  <xsl:apply-templates select="$currElem" mode="replicate">
    <xsl:with-param name="dayNo" select="."/>
  </xsl:apply-templates>
</xsl:for-each>
</xsl:template>

<xsl:template match="Worker" mode="replicate">
<xsl:param name="dayNo"/>
<Worker>
  <xsl:sequence select="id, loc"/>
  <RecordNumber><xsl:value-of select="$dayNo"/></RecordNumber>
  <WorkerDays>1</WorkerDays>
  <StartDate>
    <xsl:value-of select="xs:date(StartDate) + xs:dayTimeDuration('P1D') * 
($dayNo - 1)"/>
  </StartDate>
</Worker>
</xsl:template>

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

Текущий вывод

<?xml version="1.0" encoding="UTF-8"?>
<Workers>
<Worker>
    <id>1234</id>
    <loc>New York</loc>
    <Days>1</Days>
    <StartDate>2019-01-26</StartDate>
</Worker>
<Worker>
    <id>2345</id>
    <loc>Boston</loc>
    <RecordNumber>1</RecordNumber>
    <WorkerDays>1</WorkerDays>
    <StartDate>2019-02-01</StartDate>
</Worker>
<Worker>
    <id>2345</id>
    <loc>Boston</loc>
    <RecordNumber>2</RecordNumber>
    <WorkerDays>1</WorkerDays>
    <StartDate>2019-02-02</StartDate>
</Worker>
<Worker>
    <id>2345</id>
    <loc>Boston</loc>
    <RecordNumber>3</RecordNumber>
    <WorkerDays>1</WorkerDays>
    <StartDate>2019-02-03</StartDate>
</Worker>
<Worker>
    <id>2345</id>
    <loc>Boston</loc>
    <RecordNumber>1</RecordNumber>
    <WorkerDays>1</WorkerDays>
    <StartDate>2019-02-01</StartDate>
</Worker>
<Worker>
    <id>2345</id>
    <loc>Boston</loc>
    <RecordNumber>2</RecordNumber>
    <WorkerDays>1</WorkerDays>
    <StartDate>2019-02-02</StartDate>
</Worker>
 </Workers>

Мне нужно <RecordNumber></RecordNumber> для отображенияпоследовательные числа.В настоящее время он показывает 1, 2, 3 и 1, 2.

Вместо этого мне нужны 1, 2, 3, 4,5.

В настоящее время мой XSLT-код имеет два цикла <for-each>, которые выполняются на основе значений <Days> и <Units> (пожалуйста, обратитесь ко второму узлу <Worker> в моем примере ввода xml).Я думаю, именно поэтому я получаю 1,2,3 и 1,2 в <RecordNumber>

Я попытался использовать положение position() и объявить его как переменную и использовать его в моем шаблоне, который, кажется, не работает,

Я также попытался выполнить еще один цикл for-each для выполнения position(), который также, кажется, не работает

Ожидаемый результат -

<?xml version="1.0" encoding="UTF-8"?>
<Workers>
<Worker>
    <id>1234</id>
    <loc>New York</loc>
    <Days>1</Days>
    <StartDate>2019-01-26</StartDate>
</Worker>
<Worker>
    <id>2345</id>
    <loc>Boston</loc>
    <RecordNumber>1</RecordNumber>
    <WorkerDays>1</WorkerDays>
    <StartDate>2019-02-01</StartDate>
</Worker>
<Worker>
    <id>2345</id>
    <loc>Boston</loc>
    <RecordNumber>2</RecordNumber>
    <WorkerDays>1</WorkerDays>
    <StartDate>2019-02-02</StartDate>
</Worker>
<Worker>
    <id>2345</id>
    <loc>Boston</loc>
    <RecordNumber>3</RecordNumber>
    <WorkerDays>1</WorkerDays>
    <StartDate>2019-02-03</StartDate>
</Worker>
<Worker>
    <id>2345</id>
    <loc>Boston</loc>
    <RecordNumber>4</RecordNumber>
    <WorkerDays>1</WorkerDays>
    <StartDate>2019-02-01</StartDate>
</Worker>
<Worker>
    <id>2345</id>
    <loc>Boston</loc>
    <RecordNumber>5</RecordNumber>
    <WorkerDays>1</WorkerDays>
    <StartDate>2019-02-02</StartDate>
</Worker>
 </Workers>

Может кто-нибудь помочь мне выяснитьЧто еще я могу попытаться получить правильный порядковый номер (<RecordNumber>, пожалуйста?

1 Ответ

2 голосов
/ 08 апреля 2019

Просто определите переменную для хранения значения Days и добавьте ее к параметру dayNo при репликации Units

<xsl:variable name="days" select="Days" />
<xsl:for-each select="1 to Units">
  <xsl:apply-templates select="$currElem" mode="replicate">
    <xsl:with-param name="dayNo" select=". + $days"/>
  </xsl:apply-templates>
</xsl:for-each>
...