通过 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 将使代码更易于管理,更易于构建、阅读和维护。