通过 XSL 匹配 XML 中的特定元素
Match a specific element in XML via XSL
我有以下 XML 消息,我正尝试通过 XSL 样式表处理该消息:
<?xml version="1.0" encoding="UTF-8"?>
<array xmlns="http://www.w3.org/2005/xpath-functions">
<map>
<array key="results">
<map>
<string key="id">5b33c2e8-8ab2-4314-82bf-e41a007c076f</string>
<string key="profileId">0f53bfe5-4ef3-4424-9ad2-ad8181007e22</string>
</map>
</array>
<map key="_embedded">
<array key="individuals">
<map>
<string key="id">0f53bfe5-4ef3-4424-9ad2-ad8181007e22</string>
<string key="name">John</number>
</map>
</array>
</map>
<map key="paging">
<number key="pageNumber">1</number>
<number key="pageSize">10</number>
<number key="totalCount">4</number>
</map>
</map>
</array>
我的代码如下:
<xsl:template match="/" name="xsl:initial-template">
<xsl:variable name="input-as-xml" select="json-to-xml($json)"/>
<xsl:variable name="transformed-xml">
<array xmlns="http://www.w3.org/2005/xpath-functions">
<xsl:for-each select="$input-as-xml/fn:array/fn:map/fn:array[@key = 'results']/*">
<map xmlns="http://www.w3.org/2005/xpath-functions">
<xsl:variable name="profileId">
<xsl:value-of select="*[@key = 'profileId']"/>
</xsl:variable>
<xsl:if test="*[@key = 'id'] != ''">
<string key="id">
<xsl:value-of select="*[@key = 'id']"/>
</string>
</xsl:if>
<xsl:for-each select="../fn:map[@key = '_embeded']/fn:array[@key = 'individuals'][@id=$profileId]/*">
<array key="profiles">
<string key="id">
<xsl:value-of select="fn:map/*[@key = 'id']"/>
</string>
</array>
</xsl:for-each>
</map>
</xsl:for-each>
</array>
</xsl:variable>
<xsl:value-of select="xml-to-json($transformed-xml, map {'indent': true()})"/>
</xsl:template>
我想做的是将 individuals/id 映射到 results/profileId,但显然我匹配个人的方式不正确。
我需要一些帮助才能正确匹配。
根据您的评论
the individuals
array has a <string key="id">
, basically I want to
select values only if the id
within the array has the value equal to
profileId
您可能想要 select fn:array[@key = 'individuals'][.//fn:string[@id = $profileId]]
,即 array
的后代 string
与匹配的 id
.
很难给出一个更完整的例子,因为输入的例子 <string key="name">John</number>
格式不正确。
与前面的问题一样,我认为转向基于模板的匹配而不是在单个模板中嵌套 for-each 将使代码更易于管理,更易于构建、阅读和维护。
我有以下 XML 消息,我正尝试通过 XSL 样式表处理该消息:
<?xml version="1.0" encoding="UTF-8"?>
<array xmlns="http://www.w3.org/2005/xpath-functions">
<map>
<array key="results">
<map>
<string key="id">5b33c2e8-8ab2-4314-82bf-e41a007c076f</string>
<string key="profileId">0f53bfe5-4ef3-4424-9ad2-ad8181007e22</string>
</map>
</array>
<map key="_embedded">
<array key="individuals">
<map>
<string key="id">0f53bfe5-4ef3-4424-9ad2-ad8181007e22</string>
<string key="name">John</number>
</map>
</array>
</map>
<map key="paging">
<number key="pageNumber">1</number>
<number key="pageSize">10</number>
<number key="totalCount">4</number>
</map>
</map>
</array>
我的代码如下:
<xsl:template match="/" name="xsl:initial-template">
<xsl:variable name="input-as-xml" select="json-to-xml($json)"/>
<xsl:variable name="transformed-xml">
<array xmlns="http://www.w3.org/2005/xpath-functions">
<xsl:for-each select="$input-as-xml/fn:array/fn:map/fn:array[@key = 'results']/*">
<map xmlns="http://www.w3.org/2005/xpath-functions">
<xsl:variable name="profileId">
<xsl:value-of select="*[@key = 'profileId']"/>
</xsl:variable>
<xsl:if test="*[@key = 'id'] != ''">
<string key="id">
<xsl:value-of select="*[@key = 'id']"/>
</string>
</xsl:if>
<xsl:for-each select="../fn:map[@key = '_embeded']/fn:array[@key = 'individuals'][@id=$profileId]/*">
<array key="profiles">
<string key="id">
<xsl:value-of select="fn:map/*[@key = 'id']"/>
</string>
</array>
</xsl:for-each>
</map>
</xsl:for-each>
</array>
</xsl:variable>
<xsl:value-of select="xml-to-json($transformed-xml, map {'indent': true()})"/>
</xsl:template>
我想做的是将 individuals/id 映射到 results/profileId,但显然我匹配个人的方式不正确。
我需要一些帮助才能正确匹配。
根据您的评论
the
individuals
array has a<string key="id">
, basically I want to select values only if theid
within the array has the value equal toprofileId
您可能想要 select fn:array[@key = 'individuals'][.//fn:string[@id = $profileId]]
,即 array
的后代 string
与匹配的 id
.
很难给出一个更完整的例子,因为输入的例子 <string key="name">John</number>
格式不正确。
与前面的问题一样,我认为转向基于模板的匹配而不是在单个模板中嵌套 for-each 将使代码更易于管理,更易于构建、阅读和维护。