与“连字符”每两个数字XSL格式化号码(XSL formatting number with 

2019-10-19 10:14发布

我已经寻找了几天,发现一例[这里] [1]

[1]: XSLT格式化数字,插入“ - ”每4位从最右边的数字开始后 ,但它似乎并没有制定出符合市场预期。

以下是我需要的情况发生。 我有一个数字,是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'

任何人都可以向我解释什么,我做错了什么? 如果可能的话,我想继续使用“号格式”功能。

谢谢

-frustrated

Answer 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不是一个数字 ,你不应该尝试将格式应用于其数。 否则,你将失去任何前导零的“数”可能有。



Answer 2:

您可以使用STR:从拆分模板http://www.exslt.org/str/index.html 。

我只是测试你的样品输入“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>


Answer 3:

试着运行这个样式表,与任何来源:

<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或撒克逊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)"/>


Answer 4:

与您的代码,我得到一个错误,因为在xsl:十进制格式是xsl内:模板; 它应该是外面。 当我解决,这对我的作品(撒克逊9.5)。

但我同意,治疗患者ID为数字并不好。

我有无穷无尽的麻烦与我的电子表格软件处理的增值税号作为数字,因为他们都是清一色的数字,从而失去了任何前导零。



文章来源: XSL formatting number with 'hyphens' every two digits