簡體   English   中英

如何在XSLT 2.0中對數字排序?

[英]How to sequence a number in 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>的值執行(請參考示例輸入xml中的第二個<Worker>節點)。 我認為這就是為什么我在<RecordNumber>得到1,2,3和1,2的原因

我嘗試使用position 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>嗎?

只需定義一個變量來保存Days值,然后在復制Units時將其添加到dayNo參數上即可

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM