【问题标题】:How to sequence a number in XSLT 2.0?如何在 XSLT 2.0 中对数字进行排序?
【发布时间】:2019-04-08 14:25:34
【问题描述】:

我有以下输入 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>

我需要&lt;RecordNumber&gt;&lt;/RecordNumber&gt; 来显示序列号。目前显示的是 1、2、3 和 1、2。

我需要 1, 2, 3, 4,5 而不是这个。

目前,我的 XSLT 代码有两个基于 &lt;Days&gt;&lt;Units&gt; 的值执行的 &lt;for-each&gt; 循环(请参考我的示例输入 xml 中的第二个 &lt;Worker&gt; 节点)。我想这就是为什么我在&lt;RecordNumber&gt; 中得到 1,2,3 和 1,2 的原因@

我尝试使用位置 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>

谁能帮我找出我还能尝试得到正确的序列号(&lt;RecordNumber&gt;好吗?

【问题讨论】:

    标签: xslt xslt-2.0


    【解决方案1】:

    只需定义一个变量来保存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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 2018-02-17
      • 2011-04-04
      • 1970-01-01
      相关资源
      最近更新 更多