草庐IT

xml - 在 XSLT 中用逗号作为小数点分隔符求和数字?

coder 2024-07-03 原文

我有一个 XML 文件,其中数字以逗号分隔

<foo>
  <bar val="1,23"/>
  <bar val="4,56"/>
  <bar val="7,89"/>
</foo>

我想对 XSLT 中的 /foo/bar/@val 值求和,但我有点卡在格式上。有谁知道正确的语法是什么?

最佳答案

我猜测,“val” 属性中指定的值是一个用逗号代替小数点的数字。

有几种可能的解决方案:

我。 XSLT 1.0

这个转换:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
 >
  <xsl:output method="text"/>
<!--                                           -->  
    <xsl:template match="foo">
      <xsl:variable name="vrtfBars">
        <xsl:for-each select="bar">
          <bar val="{translate(@val, ',', '.')}"/>
        </xsl:for-each>
      </xsl:variable>
<!--                                           -->
      <xsl:value-of select=
       "sum(ext:node-set($vrtfBars)/*/@val)"/>
    </xsl:template>
</xsl:stylesheet>

应用于最初提供的 XML 文档时:

<foo>
    <bar val="1,23"/>
    <bar val="4,56"/>
    <bar val="7,89"/>
</foo>

产生想要的结果:

13.68

二。 XSLT 2.0

这个转换:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 exclude-result-prefixes="f xs"
 >
 <xsl:output method="text"/>
<!--                                           -->
 <xsl:template match="foo">
  <xsl:sequence select=
   "sum(bar/@val/number(translate(., ',', '.')))" 
   />
 </xsl:template>
</xsl:stylesheet>

应用于同一个 XML 文档时,产生相同的正确结果:

13.68

III. FXSL 2.x

这个转换:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:f="http://fxsl.sf.net/"
 xmlns:my="my:fun"
 exclude-result-prefixes="my f xs"
 >
   <xsl:import href="../f/func-transform-and-sum.xsl"/>
<!--                                           -->
 <xsl:output method="text"/>
<!--                                           -->
 <xsl:template match="foo">
  <xsl:sequence select=
   "sum(
        f:transform-and-sum(my:makeNum(), bar/@val )
        )" 
   />
 </xsl:template>
<!--                                           -->
 <xsl:function name="my:makeNum" as="xs:double">
   <xsl:param name="psNum" as="xs:string"/>
<!--                                           -->
   <xsl:sequence select="number(translate($psNum, ',', '.'))"/>
 </xsl:function>
<!--                                           -->
 <xsl:function name="my:makeNum" as="element()">
   <my:makeNum/>
 </xsl:function>
<!--                                           -->
 <xsl:template match="my:makeNum" as="xs:double" mode="f:FXSL">
   <xsl:param name="arg1" as="xs:string"/>
<!--                                           -->
   <xsl:sequence select="my:makeNum($arg1)"/>
 </xsl:template>
</xsl:stylesheet>

应用于同一 XML 文档时产生相同的正确结果:

13.68

最后一种解决方案更灵活,当需要在求和之前对值进行更复杂的转换时可以成功使用。

关于xml - 在 XSLT 中用逗号作为小数点分隔符求和数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/647991/

有关xml - 在 XSLT 中用逗号作为小数点分隔符求和数字?的更多相关文章

  1. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  2. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  3. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  4. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  5. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  6. ruby-on-rails - 应用程序的名称是否可以作为变量使用? - 2

    当我创建一个Rails应用程序时,控制台:railsnewfoo我的代码可以使用字符串“foo”吗?puts"Yourapp'snameis"+app_name_bar 最佳答案 Rails.application.class将为您提供应用程序的全名(例如YourAppName::Application)。从那里您可以使用Rails.application.class.parent获取模块名称。 关于ruby-on-rails-应用程序的名称是否可以作为变量使用?,我们在StackOve

  7. ruby-on-rails - 使用作为方法的值在 ruby​​ 中搜索哈希 - 2

    我在搜索我的值是方法的散列时遇到问题。我只是不想运行plan_type与键匹配的方法。defmethod(plan_type,plan,user){foo:plan_is_foo(plan,user),bar:plan_is_bar(plan,user),waa:plan_is_waa(plan,user),har:plan_is_har(user)}[plan_type]end目前如果我传入“bar”作为plan_type,所有方法都会运行,我怎么能只运行plan_is_bar方法呢? 最佳答案 这个变体怎么样?defmethod

  8. ruby - 无法在 Ruby 中将 ffmpeg 作为子进程运行 - 2

    我正在尝试使用以下代码通过将ffmpeg实用程序作为子进程运行并获取其输出并解析它来确定视频分辨率:IO.popen'ffmpeg-i'+path_to_filedo|ffmpegIO|#myparsegoeshereend...但是ffmpeg输出仍然连接到标准输出并且ffmepgIO.readlines是空的。ffmpeg实用程序是否需要一些特殊处理?或者还有其他方法可以获得ffmpeg输出吗?我在WinXP和FedoraLinux下测试了这段代码-结果是一样的。 最佳答案 要跟进mouviciel的评论,您需要使用类似pope

  9. Ruby 正则表达式匹配逗号,但忽略括号中的逗号 - 2

    我正在尝试通过正则表达式拆分参数列表。这是一个带有我的参数列表的字符串:"a=b,c=3,d=[1,3,5,7],e,f=g"我想要的是:["a=b","c=3","d=[1,3,5,7]","e","f=g"]我试过先行,但Ruby不允许使用动态范围后行,所以这行不通:/(?如何让正则表达式忽略方括号中的所有内容? 最佳答案 也许这样的东西对你有用:str.scan(/(?:\[.*?\]|[^,])+/)编辑再三考虑。简单的非贪婪匹配器在某些嵌套括号的情况下会失败。 关于Ruby正则

  10. ruby - 如何跳过 CSV 文件的第一行并将第二行作为标题 - 2

    有没有办法跳过CSV文件的第一行,让第二行作为标题?我有一个CSV文件,第一行是日期,第二行是标题,所以我需要能够在遍历它时跳过第一行。我尝试使用slice但它会将CSV转换为数组,我真的很想将其读取为CSV,以便我可以利用header。 最佳答案 根据您的数据,您可以使用另一种方法和skip_lines-option此示例跳过所有以#开头的行require'csv'CSV.parse(DATA.read,:col_sep=>';',:headers=>true,:skip_lines=>/^#/#Markcomments!)do|

随机推荐