【问题标题】:LineNumbering or Incrementing Counter on XSLXSL 上的 LineNumbering 或递增计数器
【发布时间】:2013-07-14 16:37:12
【问题描述】:

我确定以前有人问过这个问题,但我只是没有使用正确的标准进行搜索,或者我已经看这个问题太久了,只见树木不见森林。

基本上,对于 XML/XSL 转换而言,这并不是什么新鲜事,这不是我的主要职责,我有一个 XSL 转换,可以将 Microsoft SSRS 报告中的 XML 转换为格式化的文本文件,以及我正在尝试做的事情计算行号以在正确的位置强制分页:

这是我从 SSRS 输出的 XML 输出示例:

<?xml version="1.0" encoding="utf-8"?>
<Report  Name="GR_ItemSample.srdl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="GR_ItemSample.srdl">

    <Item Detail_ItemCode="6407" Detail_Description="SOLU-CORTEF INJ.SOL.250MG ACT-" Detail_UnitOfSale="AOV" Detail_Quantity="1" Detail_UnitPrice="0,00" Detail_Gross="0,00" Detail_Discount1Percentage="0,00" Detail_Discount1Amount="0,00" Detail_Discount2Percentage="0,00" Detail_Discount2Amount="0,00" Detail_Discount3Percentage="0,00" Detail_Discount3Amount="0,00" Detail_Net="0,00" Detail_Lot="TEST123" Detail_VatPercentage="0,0" Detail_MiscDesc2="*** This is a second line description test *******" valueOnlyIdentifier="1" />
    <Item Detail_ItemCode="6407" Detail_Description="SOLU-CORTEF INJ.SOL.250MG ACT-" Detail_UnitOfSale="AOV" Detail_Quantity="1" Detail_UnitPrice="0,00" Detail_Gross="0,00" Detail_Discount1Percentage="0,00" Detail_Discount1Amount="0,00" Detail_Discount2Percentage="0,00" Detail_Discount2Amount="0,00" Detail_Discount3Percentage="0,00" Detail_Discount3Amount="0,00" Detail_Net="0,00" Detail_Lot="TEST123" Detail_VatPercentage="0,0" Detail_MiscDesc2="" valueOnlyIdentifier="1" />
    <Item Detail_ItemCode="6407" Detail_Description="SOLU-CORTEF INJ.SOL.250MG ACT-" Detail_UnitOfSale="AOV" Detail_Quantity="1" Detail_UnitPrice="0,00" Detail_Gross="0,00" Detail_Discount1Percentage="0,00" Detail_Discount1Amount="0,00" Detail_Discount2Percentage="0,00" Detail_Discount2Amount="0,00" Detail_Discount3Percentage="0,00" Detail_Discount3Amount="0,00" Detail_Net="0,00" Detail_Lot="TEST123" Detail_VatPercentage="0,0" Detail_MiscDesc2="*** This is a second line description test *******" valueOnlyIdentifier="1" />
    <Item Detail_ItemCode="6407" Detail_Description="SOLU-CORTEF INJ.SOL.250MG ACT-" Detail_UnitOfSale="AOV" Detail_Quantity="1" Detail_UnitPrice="0,00" Detail_Gross="0,00" Detail_Discount1Percentage="0,00" Detail_Discount1Amount="0,00" Detail_Discount2Percentage="0,00" Detail_Discount2Amount="0,00" Detail_Discount3Percentage="0,00" Detail_Discount3Amount="0,00" Detail_Net="0,00" Detail_Lot="TEST123" Detail_VatPercentage="0,0" Detail_MiscDesc2="" valueOnlyIdentifier="1" />
    <Item Detail_ItemCode="6407" Detail_Description="SOLU-CORTEF INJ.SOL.250MG ACT-" Detail_UnitOfSale="AOV" Detail_Quantity="1" Detail_UnitPrice="0,00" Detail_Gross="0,00" Detail_Discount1Percentage="0,00" Detail_Discount1Amount="0,00" Detail_Discount2Percentage="0,00" Detail_Discount2Amount="0,00" Detail_Discount3Percentage="0,00" Detail_Discount3Amount="0,00" Detail_Net="0,00" Detail_Lot="TEST123" Detail_VatPercentage="0,0" Detail_MiscDesc2="*** This is a second line description test *******" valueOnlyIdentifier="1" />
</Report>

这是我的示例 xsl 文件:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rpt="GR_ItemSample.srdl">
<xsl:output method="text" omit-xml-declaration="yes" encoding="utf-8" media-type="text/plain"/> 
<xsl:template match="rpt:Report">
    <xsl:variable name="CrLf1" select="'&#13;&#10;'"/>
    <xsl:for-each select="rpt:Item">
        <xsl:value-of select="concat(position(),' - ',@Detail_ItemCode,@Detail_Description,@Detail_UnitOfSale,@Detail_Quantity,@Detail_UnitPrice,@Detail_Gross,@Detail_Discount1Percentage,@Detail_Discount1Amount,@Detail_Discount2Percentage,@Detail_Discount2Amount,@Detail_Discount3Percentage,@Detail_Discount3Amount,@Detail_Net,@Detail_Lot,@Detail_VatPercentage,$CrLf1)"/> 
        <xsl:if test="string-length(@Detail_MiscDesc2) > 0">
            <xsl:value-of select="concat(position(),' - ',@Detail_MiscDesc2,$CrLf1)"/>              
        </xsl:if>
    </xsl:for-each> 
</xsl:template>
</xsl:stylesheet>

现在,当我运行转换时,我得到以下输出,这与我想要的很接近:

1 - 6407SOLU-CORTEF INJ.SOL.250MG ACT-AOV10,000,000,000,000,000,000,000,000,00TEST1230,0
1 - *** This is a second line description test *******
2 - 6407SOLU-CORTEF INJ.SOL.250MG ACT-AOV10,000,000,000,000,000,000,000,000,00TEST1230,0
3 - 6407SOLU-CORTEF INJ.SOL.250MG ACT-AOV10,000,000,000,000,000,000,000,000,00TEST1230,0
3 - *** This is a second line description test *******
4 - 6407SOLU-CORTEF INJ.SOL.250MG ACT-AOV10,000,000,000,000,000,000,000,000,00TEST1230,0
5 - 6407SOLU-CORTEF INJ.SOL.250MG ACT-AOV10,000,000,000,000,000,000,000,000,00TEST1230,0
5 - *** This is a second line description test *******

我正在使用 position() 在我的 for-each 循环中显示“行号”,现在当我在文本文件中为每一行打印一行时,这是完美的,但是添加了一个新要求已请求第二个描述行,这第二个描述行与@Detail_MiscDesc2 出现在同一项目行上,但它必须出现在文本文件输出中的下一行,我的 xsl 根据字符串长度有条件地执行@Detail_MiscDesc2,但是我需要知道此时的累积行号,所以我的示例输出实际上应该如下所示:

1 - 6407SOLU-CORTEF INJ.SOL.250MG ACT-AOV10,000,000,000,000,000,000,000,000,00TEST1230,0
2 - *** This is a second line description test *******
3 - 6407SOLU-CORTEF INJ.SOL.250MG ACT-AOV10,000,000,000,000,000,000,000,000,00TEST1230,0
4 - 6407SOLU-CORTEF INJ.SOL.250MG ACT-AOV10,000,000,000,000,000,000,000,000,00TEST1230,0
5 - *** This is a second line description test *******
6 - 6407SOLU-CORTEF INJ.SOL.250MG ACT-AOV10,000,000,000,000,000,000,000,000,00TEST1230,0
7 - 6407SOLU-CORTEF INJ.SOL.250MG ACT-AOV10,000,000,000,000,000,000,000,000,00TEST1230,0
8 - *** This is a second line description test *******

我需要这个,因为我还必须计算分页符和页眉和页脚,我知道对于我的文具,我每页总共只能有 22 个详细信息行。我实际上不需要打印行号(仅用于此示例)我只需要知道何时达到 22 行,以便处理页脚和分页符。我更习惯于过程编程语言,这很容易。我知道我不能为此使用 position() 并且需要使用递归模板,但我就是不知道该怎么做。任何帮助或指示将不胜感激。 我已经尽力提供尽可能多的细节,但不会啰嗦(是的,我知道那里失败了!)但如果有任何不清楚的地方,请告诉我。

谢谢

【问题讨论】:

    标签: xml xslt xml-parsing xslt-1.0


    【解决方案1】:

    您可以打印前面项目的count(),而不是打印position(),加上前面项目的计数,并带有强制第二行的描述。比如:

    count(preceding-sibling::*) + count(preceding-sibling::*[string-length(@Detail_Misc2) &gt; 0])
    

    【讨论】:

    • 我必须为每个计数添加一个 +1 以使其从 1 而不是 0 开始,然后得到我期望的 8 的答案(即八行)。我查看了前面的兄弟姐妹,但不知道如何让它为我工作。我想这肯定是看得太久了,感谢示例代码让我得到了款待。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多