#xslt #xslt-2.0
#xslt #xslt-2.0
Вопрос:
У меня есть следующий входной 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 position()
и объявить его как переменную и использовать его в моем шаблоне, который, похоже, не работает.
Я также попробовал выполнить другой цикл для каждого 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:
Просто определите переменную для хранения 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>