arrays - 在 XSLT 中创建动态数组

标签 arrays xml xslt xslt-2.0

我有一个要求,我必须连接每个 <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/

相关文章:

android - 使用 xml 在 android 中自定义形状

xml - 是什么让像 Jekyll 和 Hyde 这样的静态站点生成器比 XML 和 XSLT 更好?

java - JAXB 和 XSLT 性能

java - 显示 Java 文件而不是 XML 文件中的文本 (Android Studio)

java - 我在我的 WebView 中使用外部链接但上传文件不起作用,而它在浏览器中工作

xslt - 找不到 FOP 图像错误

php - 如何选择 ID 不在 PHP LARGE 数组中的行?

php - 无法序列化和反序列化对象以删除对象元素PHP

c - 用可变数量的参数构建一个字符串

python - 如何找到两个排序数组之间的中位数?