java XSLT创建一个新数组,迭代现有数组

2vuwiymt  于 2023-09-29  发布在  Java
关注(0)|答案(2)|浏览(108)

我试图通过迭代对象数组并创建一个新数组来收集我感兴趣的字符串。我将在稍后的转换中使用这个新数组来生成输出。
下面是我的代码:

<xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:fn="http://www.w3.org/2005/xpath-functions"
        xmlns:map="http://www.w3.org/2005/xpath-functions/map"
        xmlns:array="http://www.w3.org/2005/xpath-functions/array"
        version="3.0">
        <xsl:output method="text"/>
        <xsl:strip-space elements="*" />
        <xsl:template name="test" match="/">
            <xsl:param name="data" select="data"></xsl:param>
            <xsl:variable name="myData" select="$data" />
    
          <xsl:variable name="inputArray" select="array{'John', 'Peter'}"/>
           <xsl:variable name="myArray" select="array{}"/>
          
            <xsl:for-each select="1 to array:size($inputArray)">
            <xsl:variable name="personName" select="array:get($inputArray, .)" />
            <xsl:value-of select="$personName" />
             <xsl:variable name="myArray" select="array:append($myArray, personName)" />
            </xsl:for-each>
    <!--       <xsl:variable name="myArray" select="array:append($myArray, 'John')" />
          <xsl:variable name="myArray" select="array:append($myArray, 'Peter')" /> -->
          
          <xsl:for-each select="1 to array:size($myArray)">
          <xsl:value-of select="test" />
            <xsl:text>Person name is : </xsl:text>
            <xsl:value-of select="array:get($myArray,.)" />
        </xsl:for-each>
        </xsl:template>
    </xsl:stylesheet>

这不会将值追加到myArray中,甚至不会输入for-each块来输出“test”字符串。
输入数组的源是如下对象数组:

map {"persons": [map {
                    "name": "John",
                    "age": 33,
                    "residence":"Permanent" 
                    }, map {
                    
                    "name": "Peter",
                    "age": 36,
                    "residence":"Temporary"
                        }
            ]
    }

我将使用map:get($persons)函数阅读这个数组,并将名称收集到myArray中。

bz4sfanl

bz4sfanl1#

给定此输入变量:

<xsl:variable name="input-map" select="
    map {'persons': 
        [ 
        map {
            'name': 'John',
            'age': 33,
            'residence':'Permanent' 
            }, 
        map {
            'name': 'Peter',
            'age': 36,
            'residence':'Temporary'
            }
        ]
    }"/>

可以使用以下命令创建名称数组:

<xsl:variable name="myArray" select="array{$input-map?persons?*?name}"/>
gdrx4gfi

gdrx4gfi2#

使用XPath3.1,不要用迭代这样的过程术语来思考,那么你可以只做例如:

<xsl:variable name="inputArray" select="array{'John', 'Peter'}"/>
<xsl:variable name="myArray" select="array{ $inputArray?* }"/>

我们也可以用fold-left来说明,或者,如果你真的想“迭代”,xsl:iterate,但我认为没有必要这样做。
whole stylesheet可以是例如

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0">
  
    <xsl:output method="text"/>
    <xsl:template name="test" match="/">
        
      <xsl:variable name="inputArray" select="array{'John', 'Peter'}"/>
      <xsl:variable name="myArray" select="array{ $inputArray?* }"/>
      
      <xsl:value-of select="$myArray?* ! ('Person name is: ' || .)" separator="&#10;"/>
      
    </xsl:template>
    
</xsl:stylesheet>

为了处理Map,您仍然可以使用XPath 3.1根据属性构造数组:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0">
  
    <xsl:output method="text"/>
    <xsl:template name="test" match="/">
        
      <xsl:variable name="inputObject" select='map {"persons": [map {
                    "name": "John",
                    "age": 33,
                    "residence":"Permanent" 
                    }, map {
                    
                    "name": "Peter",
                    "age": 36,
                    "residence":"Temporary"
                        }
            ]
    }'/>
      <xsl:variable name="myArray" select="array{ $inputObject?persons?*?name }"/>
      
      <xsl:value-of select="$myArray?* ! ('Person name is: ' || .)" separator="&#10;"/>
      
    </xsl:template>
    
</xsl:stylesheet>

相关问题