在 XSLT 1.0 中重命名重复的数组名称
Renaming duplicate array names in XSLT 1.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>
我尝试使用 Identity 模板和 for-each 遍历数组列表的 XSLT。
<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 是错误的。但是我怎样才能到达嵌套在里面的数组名称。
如果您想在其父 json:object
中使用 json:array
的位置,那么您的模板应匹配 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>
但是您需要记住:
- 这将为所有
json:array
个元素编号,包括顶级元素;和
- 第一个
json:array
在你的 json:object
中的位置是 2,而不是 1。第一个位置被 json:string
元素占据。
也许
<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>
如果您知道数组的名称,将会有所帮助。
我在下面列出了具有相同名称的数组(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>
我尝试使用 Identity 模板和 for-each 遍历数组列表的 XSLT。
<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 是错误的。但是我怎样才能到达嵌套在里面的数组名称。
如果您想在其父 json:object
中使用 json:array
的位置,那么您的模板应匹配 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>
但是您需要记住:
- 这将为所有
json:array
个元素编号,包括顶级元素;和 - 第一个
json:array
在你的json:object
中的位置是 2,而不是 1。第一个位置被json:string
元素占据。
也许
<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>
如果您知道数组的名称,将会有所帮助。