我已经寻找了几天,发现一例[这里] [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
我有一个数字,是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不是一个数字 ,你不应该尝试将格式应用于其数。 否则,你将失去任何前导零的“数”可能有。
您可以使用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>
试着运行这个样式表,与任何来源:
<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)"/>
与您的代码,我得到一个错误,因为在xsl:十进制格式是xsl内:模板; 它应该是外面。 当我解决,这对我的作品(撒克逊9.5)。
但我同意,治疗患者ID为数字并不好。
我有无穷无尽的麻烦与我的电子表格软件处理的增值税号作为数字,因为他们都是清一色的数字,从而失去了任何前导零。