0

我在下面列出了具有相同名称的数组(json:array name="member")。我正在尝试将它们重命名为有意义的名称(json:array name="member1"),以便它们保持唯一值。我正在尝试使用身份模板。

输入:

<json:object xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <json:array xmlns:dpfunc="http://www.datapower.com/extensions/functions" xmlns:str="http://exslt.org/strings" name="benefits">
      <json:object>
         <json:string name="ArrayCode">A</json:string>
         <json:array name="member">
            <json:object>
               <json:string name="memberID">A-001</json:string>
            </json:object>
         </json:array>
         <json:array name="member">
            <json:object>
               <json:string name="memberID">A-002</json:string>
            </json:object>
         </json:array>
         <json:array name="member">
            <json:object>
               <json:string name="memberID">A-003</json:string>
            </json:object>
         </json:array>
      </json:object>
      <json:object>
         <json:string name="ArrayCode">B</json:string>
         <json:array name="member">
            <json:object>
               <json:string name="memberID">B-001</json:string>
            </json:object>
         </json:array>
         <json:array name="member">
            <json:object>
               <json:string name="memberID">B-002</json:string>
            </json:object>
         </json:array>
         <json:array name="member">
            <json:object>
               <json:string name="memberID">B-003</json:string>
            </json:object>
         </json:array>
      </json:object>
   </json:array>
</json:object>

预期输出:

   <json:object xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <json:array xmlns:dpfunc="http://www.datapower.com/extensions/functions" xmlns:str="http://exslt.org/strings" name="benefits">
      <json:object>
         <json:string name="ArrayCode">A</json:string>
         <json:array name="member1">
            <json:object>
               <json:string name="memberID">A-001</json:string>
            </json:object>
         </json:array>
         <json:array name="member2">
            <json:object>
               <json:string name="memberID">A-002</json:string>
            </json:object>
         </json:array>
         <json:array name="member3">
            <json:object>
               <json:string name="memberID">A-003</json:string>
            </json:object>
         </json:array>
      </json:object>
      <json:object>
         <json:string name="ArrayCode">B</json:string>
         <json:array name="member1">
            <json:object>
               <json:string name="memberID">B-001</json:string>
            </json:object>
         </json:array>
         <json:array name="member2">
            <json:object>
               <json:string name="memberID">B-002</json:string>
            </json:object>
         </json:array>
         <json:array name="member3">
            <json:object>
               <json:string name="memberID">B-003</json:string>
            </json:object>
         </json:array>
      </json:object>
   </json:array>
</json:object>

XSLT 我尝试使用 Identity 模板和 for-each 来遍历数组列表。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times" xmlns:dp="http://www.datapower.com/extensions" xmlns:dpfunc="http://www.datapower.com/extensions/functions" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx" xmlns:str="http://exslt.org/strings" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://www.datapower.com/schemas/json jsonx.xsd" extension-element-prefixes="dp" exclude-result-prefixes="xsl fo xs fn dp date">
   
   <xsl:template match="@* | node()">
      <xsl:copy>
         <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
   </xsl:template>
   
   
   <xsl:template match="json:array/@name">
      <xsl:for-each select="json:object/json:array">
         <xsl:attribute name="@name{position()}">
            <xsl:value-of select="@name"/>
         </xsl:attribute>
      </xsl:for-each>  
   </xsl:template>
   
</xsl:stylesheet>

使用上述代码输入没有发生任何变化。我想在这里使用 for-each 是错误的。但是我怎样才能达到嵌套在里面的数组名称。

4

2 回答 2

1

也许

<xsl:template match="json:array[@name = 'member']">
    <xsl:copy>
        <xsl:attribute name="name">
            <xsl:value-of select="@name"/>
            <xsl:number/>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

如果您知道数组的名称会有所帮助。

于 2021-12-04T19:33:08.950 回答
0

如果您想使用json:array其 parent中的位置json:object,那么您的模板应该匹配json:array- 例如:

<xsl:template match="json:array">
    <xsl:copy>
        <xsl:attribute name="name">
            <xsl:value-of select="@name" />
            <xsl:value-of select="position()" />
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

但是,您需要记住:

  1. 这将对所有json:array元素进行编号,包括顶级元素;和
  2. json:array你的第json:object一个位置是2,而不是1。第一个位置被json:string元素占据。
于 2021-12-04T19:20:17.423 回答