【问题标题】:XSL formatting number with 'hyphens' every two digitsXSL 格式化数字,每两位数字带有“连字符”
【发布时间】:2014-02-27 17:32:38
【问题描述】:

我已经搜索了几天,找到了一个示例 [这里][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”

谁能向我解释我做错了什么?如果可能,我想继续使用“格式编号”功能。

谢谢

-沮丧

【问题讨论】:

  • 你能显示你的源 XML 吗?那是你的工作 XSL 文件吗? &lt;xsl:decimal-format&gt; 应该是顶级的。我认为如果它在template 内,它甚至不会编译。尝试将 $modPatientID 替换为“1122334”。它是否按预期工作?
  • 还没有运气 - 这是我的工作 XSL 文件。我将 移到顶层(模板上方),但它仍然没有任何影响。输出仍然是 '1-1-2-2-3-3-4' 我保留了这个更改,然后我尝试用 '1122334' 替换 $modPatientID 并且输出仍然是 '1-1-2-2- 3-3-4'。

标签: xslt numbers format


【解决方案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 建议的更正:
---Don '不要使用它 - 请参阅下面我的编辑 #2 ---

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

编辑 2:

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

【讨论】:

  • 好吧,丢失任何前导零都不好。我明天试试你的第一种方法。
  • 好的,我等不及了。我用了你的第一种方法,效果也很好。感谢您考虑前导零!这将是一场真正的噩梦。
  • 大声笑,实际上我刚刚遇到了“前导零”在交给我之前被丢弃的问题,现在我需要将其添加回来并用连字符对其进行格式化,但我'会问另一个问题并参考这个问题。患者 ID 有六位数字,实际上应该是七位数字,前导零。
【解决方案2】:

您可以使用来自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>

【讨论】:

    【解决方案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 或 Saxon 6.5.5)。在这种情况下,如果您使用##-##-##-# 或简单地使用-#,则不会有任何区别,因为分组分隔符仅从右侧读取一次。

    您可以尝试-##,您的号码将分成两个一组。

    Saxon 9 以您期望的方式打印数字(这让我感到惊讶)。如果您不能将它用作您的 XSL 处理器,您可以尝试以下 hack:

    &lt;xsl:value-of select="substring-before(format-number(concat('1122334','0'), '-##','dashes'), '0')"/&gt;

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

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

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

    【讨论】:

    • "我添加了一个 0,将数字格式化为 2 个一组,然后删除了 0。" 尝试使用 '1120334'。
    • 所以,我尝试运行上面的样式表,输出为 '1-1-2-2-3-3-4',所以它是我的转换器 - 感谢您的解释,因为我不能弄清楚它是从右到左阅读的。我还尝试了您在原始 SS 中提供的 hack(我从副本中注释掉了有问题的“格式编号”行),将其粘贴到正确的位置,输出为“1”。 :-/ pastebin.com/RhP23hTM - 我尝试使用变量名和“真实”数字。
    • 糟糕。 @michael.hor257k 是对的 :) 这个解决方案中有一个错误。但是您可以使用substring 并获取字符串直到长度为1。
    • 他也在他的解决方案中修复了它:)
    • 如果我用 '1122334' 尝试它,它会返回 '1' 并且这是使用上面的 holderdarocha 发布的黑客。
    【解决方案4】:

    使用您的代码,我收到一个错误,因为 xsl:decimal-format 在 xsl:template;它应该在外面。当我修复它对我有用时(在 Saxon 9.5 中)。

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

    我的电子表格软件将增值税号码视为数字,因为它们都是数字,因此会丢失任何前导零,因此我遇到了无穷无尽的麻烦。

    【讨论】:

      猜你喜欢
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 2011-06-04
      相关资源
      最近更新 更多