带有'连字符的XSL格式编号'每两位数

时间:2014-02-26 21:10:31

标签: xslt numbers format

我搜索了几天,发现了一个例子[这里] [1]

[1]:XSLT formatting numbers, insert '-' after every 4 digits starting from the right most digit,但似乎没有达到预期效果。

这是我需要发生的事情。我有一个7位数的数字,如'1122334',我需要强制它到'11 -22-33-4'。

到目前为止,这是我的代码:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml"/>
    <xsl:template match="/dataset">
      <xsl:decimal-format name="dashes" grouping-separator='-'/>
      <dataset>
         <!-- Nullify (0040,A043) Concept Name Code Sequence -->
        <attr tag="0040A043" vr="SQ"/>
      </dataset>
      <dataset>
       <xsl:variable name="modPatientID" select="attr[@tag='00100020']"/>
       <xsl:variable name="AccNum" select="attr[@tag='00080050']"/>
         <xsl:if test="string-length($modPatientID)=7">
           <xsl:if test="contains(attr[@tag='00080050'],'_')">
             <!-- (0008,0050) Accession_Number -->
             <attr tag="00100020" vr="LO">
               <xsl:value-of select="format-number($modPatientID, '##-##-##-#','dashes')"/>
             </attr>
            </xsl:if>
           </xsl:if>
          </dataset>
         </xsl:template>
        </xsl:stylesheet>

我得到的输出是'1-1-2-2-3-3-4',我希望它看起来像'11 -22-33-4'

任何人都可以向我解释我做错了什么吗?如果可能的话,我想继续使用'format-number'功能。

谢谢

-frustrated

4 个答案:

答案 0 :(得分:1)

  

我有一个7位数的数字,如'1122334',我需要强迫   它到'11 -22-33-4'。

这是一种方式:

<xsl:value-of select="concat(
   substring($modPatientID, 1, 2), '-', 
   substring($modPatientID, 3, 2), '-' , 
   substring($modPatientID, 5, 2), '-' ,
   substring($modPatientID, 7)
)"/>

这是另一个:
---请勿使用此功能 - 请参阅下面的编辑#2 ---

<xsl:value-of select="concat(
   format-number(substring($modPatientID, 1, 6), '-##', 'dashes'), '-', 
   substring($modPatientID, 7)
)"/>

修改
这是第三个,这只是对@helderdarocha建议的修正:
---请勿使用此功能 - 请参阅下面的编辑#2 ---

<xsl:value-of select="substring(format-number(concat($modPatientID, 0), '-##', 'dashes'), 1, 10)"/>

编辑2:

这应该从一开始就发生在我身上:您的PatientID不是数字,您不应该尝试对其应用数字格式。否则你将丢失“数字”可能具有的任何前导零。

答案 1 :(得分:1)

您可以使用http://www.exslt.org/str/index.html中的str:split模板。

我刚测试了你的样本输入'1122334',它运行正常。

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:func="http://exslt.org/functions"
    xmlns:exsl="http://exslt.org/common"
    xmlns:str="http://exslt.org/strings"
    extension-element-prefixes="str func exsl">
    <xsl:import href="str.xsl" />

    <xsl:template match="/">
        <div>
            <xsl:variable name="num">1122334</xsl:variable>
            <xsl:for-each select="str:split($num, '')">
                <xsl:value-of select="."/>
                <xsl:if test="(position() mod 2) = 0 and (position() != last())">-</xsl:if>

            </xsl:for-each>
        </div>
    </xsl:template>
</xsl:stylesheet>

答案 2 :(得分:0)

尝试使用任何来源运行此样式表:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:decimal-format name="dashes" grouping-separator='-'/>
    <xsl:template match="/">
        <xsl:value-of select="format-number('1122334', '##-##-##-#','dashes')"/>
    </xsl:template>
</xsl:stylesheet>

是否打印11-22-33-4?如果没有,它会揭示你正在使用的变压器(可能是Xalan或Saxon 6.5.5)。在这种情况下,如果您使用##-##-##-#或仅-#,则不会有任何区别,因为分组分隔符只能从右侧读取一次。

您可以尝试-##,并且您将以两人为一组获得您的号码。

Saxon 9以您预期的方式打印数字(这对我来说是令人惊讶的)。如果你不能将它用作XSL处理器,你可以尝试下面的黑客攻击:

<击> <xsl:value-of select="substring-before(format-number(concat('1122334','0'), '-##','dashes'), '0')"/>

我添加了0,将数字格式化为2个组,然后删除了0

编辑:这是一个糟糕的黑客。 @ michael.hor257k正确地观察到一旦插入零的数字就会失败。因此,而不是substring-before使用他的解决方案中建议的substring

<xsl:value-of select="substring(format-number(concat('1122334', 0), '-##', 'dashes'), 1, 10)"/>

答案 3 :(得分:0)

使用您的代码,我收到错误,因为xsl:decimal-format在xsl:template中;它应该在外面。当我确定它适用于我(在Saxon 9.5中)。

但我同意,将患者ID视为一个数字并不好。

我的电子表格软件将增值税号码视为数字,因此它们都是全数字,因此会丢失任何前导零。