草庐IT

arrays - 在 XSLT 中创建动态数组

coder 2024-07-04 原文

我有一个要求,我必须连接每个 <troubleticketalarm>将每个警报的详细信息转化为一个字符串,然后将其映射到我的 xslt 中的描述字段。 说明在我的 xslt 中属于数组类型。

这是我的 xml,

<ticketDetails>
    <alarms> 
        <troubleticketalarm> 
            <alarmId>3117</alarmId>
            <alarmName>OSS</alarmName> 
            <amo>amo</amo> 
            <alarmedEquipment>alarmedEquipment</alarmedEquipment> 
            <severity>1</severity> 
            <specificProblem>specificProblem</specificProblem>
            <probableCause>probableCause</probableCause>
            <activationDate>2015-03-17T17:33:04</activationDate>
            <associationDate>2015-03-17T17:33:04</associationDate>
            <clearDate>2015-03-17T17:33:04</clearDate>
        </troubleticketalarm> 
        <troubleticketalarm> 
            <alarmId>3118</alarmId> 
            <alarmName>OSS123</alarmName>
            <activationDate>2015-03-17T17:33:0405:30</activationDate>
            <asociationDate>2015-03-17T17:33:0405:30</asociationDate>
            <clearDate></clearDate>
        </troubleticketalarm>
        <troubleticketalarm> 
            <alarmId>3119</alarmId> 
            <alarmName>OSS124</alarmName>
            <amo>amo</amo> 
            <alarmedEquipment>alarmedEquipment</alarmedEquipment> 
            <severity>1</severity> 
            <activationDate>2015-03-17T17:33:0405:30</activationDate>
            <asociationDate>2015-03-17T17:33:0405:30</asociationDate>
            <clearDate></clearDate>
        </troubleticketalarm>
    </alarms>
</ticketDetails>

这是 xslt 的一部分:

<ns:Description type="Array">
     <ns:Description type="String" mandatory="" readonly=""></ns:Description>
</ns:Description>

我想要的是连接由“|”分隔的值并将其映射到 ns:Description 的每个连接值

连接的字符串看起来像这样

3117|OSS|amo|alarmedEquipment|1|specificProblem|probableCause|2015-03-17T17:33:04+05:30|2015-03-17T17:33:04+05:30|2015-03-17T17:33:04+05:30

3118|OSS123|||||||2015-03-17T17:33:04+05:30|

3119|OSS124|amo|alarmedEquipment|1|||2015-03-17T17:33:04+05:30|2015-03-17T17:33:04+05:30|

应将这 3 个字符串添加到 Description[0]、Description[1]、Description[1]。 可能有多个 <troubleticketalarm> xml 中的标记,因此 xslt 描述应该是动态的。

我如何实现这一点?如果问题不清楚,请告诉我。

编辑

我的 XSLT 文件看起来像

<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    <xsl:template match='/'>
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://schemas.hp.com/SM/7" xmlns:com="http://schemas.hp.com/SM/7/Common" xmlns:xm="http://www.w3.org/2005/05/xmlmime">
           <soapenv:Header/>
           <soapenv:Body>
              <ns:CloseIncidentRequest attachmentInfo="" attachmentData="" ignoreEmptyElements="true" updateconstraint="-1">
                 <ns:model query="">
                    <ns:keys query="" updatecounter="1">
                       <ns:IncidentID type="String" mandatory="" readonly=""></ns:IncidentID>
                    </ns:keys>
                    <ns:instance query="" uniquequery="" recordid="" updatecounter="1">
                        <ns:IncidentID type="String" mandatory="" readonly=""></ns:IncidentID>
                        <ns:Description type="Array">
                                <ns:Description type="String" mandatory="" readonly=""></ns:Description>
                        </ns:Description>
                        ......
                        ......
                    </ns:instance>
                </ns:model>
              </ns:CloseIncidentRequest>
            </soapenv:Body>
        </soapenv:Envelope>
    </xsl:template>
</xsl:stylesheet>

最佳答案

如果您不知道子元素的数量和名称,但想使用带有大多数子元素的troubleticketalarm 作为列表的定义,那么

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:output method="text" />
    <xsl:strip-space elements="*"/>

    <xsl:variable name="alarms" select="//troubleticketalarm"/>
    <xsl:variable name="max" select="max($alarms/count(*))"/>
    <xsl:variable name="col-names" select="$alarms[count(*) eq $max]/*/local-name()"/>

    <xsl:key name="k1" match="troubleticketalarm/*" use="local-name()"/>

    <xsl:template match="troubleticketalarm">
        <xsl:value-of select="for $name in $col-names return (if (key('k1', $name, current())) then key('k1', $name, current()) else '')" separator="|"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:template>

</xsl:transform>

可能会有帮助。它在线 http://xsltransform.net/gWmuiJY和输出

3117|OSS|amo|alarmedEquipment|1|specificProblem|probableCause|2015-03-17T17:33:04|2015-03-17T17:33:04|2015-03-17T17:33:04
3118|OSS123||||||2015-03-17T17:33:0405:30||
3119|OSS124|amo|alarmedEquipment|1|||2015-03-17T17:33:0405:30||

关于arrays - 在 XSLT 中创建动态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31132208/

有关arrays - 在 XSLT 中创建动态数组的更多相关文章

  1. ruby - 在 Ruby 中实现 `call_user_func_array` - 2

    我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  4. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  5. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  6. Ruby Koans about_array_assignment - 非平行与平行分配歧视 - 2

    通过ruby​​koans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John

  7. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  8. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

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

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

  10. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

随机推荐