我搜索了几天,发现了一个例子[这里] [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
答案 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)"/>
这应该从一开始就发生在我身上:您的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视为一个数字并不好。
我的电子表格软件将增值税号码视为数字,因此它们都是全数字,因此会丢失任何前导零。