首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用XSLT搜索XML树节点以获取每个节点的父节点

如何使用XSLT搜索XML树节点以获取每个节点的父节点
EN

Stack Overflow用户
提问于 2021-03-17 14:22:09
回答 1查看 24关注 0票数 0

假设我有一个XML,类似于:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<t:object xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3"
   xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
   xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
                      xmlns:apti="http://midpoint.evolveum.com/xml/ns/public/common/api-types-3">    
          
               <apti:object oid="2">      
                  <name>34567892</name>
                  <parentOrgRef oid="1"/>      
               </apti:object>
            
               <apti:object oid="4">  
                  <name>50001007</name>
                  <parentOrgRef oid="3"/>
               </apti:object>
            
               <apti:object oid="5">    
                  <name>50001012</name>
                  <parentOrgRef oid="4"/>      
               </apti:object>
            
               <apti:object oid="6">      
                  <name>50001806</name>
                  <parentOrgRef oid="5"/>
               </apti:object>
            
               <apti:object oid="3">      
                  <name>50001802</name>
                  <parentOrgRef oid="2"/>      
               </apti:object>
                  
               <apti:object oid="7">  
                  <name>50001742</name>
                  <parentOrgRef oid="6"/>
               </apti:object>
            
               <apti:object oid="1">      
                <name>50001282</name>
                  <parentOrgRef oid="0"/>      
               </apti:object>
            </t:object>

我想使用XSLT提取每个节点的父节点的名称。

例如

代码语言:javascript
运行
复制
 <node>
    <name>34567892</name>
    <parent>50001282</parent>
  </node>

我的XSLT是

代码语言:javascript
运行
复制
 <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:math="http://www.w3.org/2005/xpath-functions/math"
        xmlns:map="http://www.w3.org/2005/xpath-functions/map"
        xmlns:array="http://www.w3.org/2005/xpath-functions/array"
        exclude-result-prefixes="#all"
        xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3"
        xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
        xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
         xmlns:apti="http://midpoint.evolveum.com/xml/ns/public/common/api-types-3"
        version="3.0">
    
      <xsl:mode on-no-match="shallow-copy"/>    
      <xsl:output method="html" indent="yes" html-version="5"/>    
    <xsl:key name="oid" match="apti:object" use="@oid"/>    
    <xsl:template match="apti:object[key('oid', @oid, /t:object)]">
      <xsl:copy>
          <xsl:apply-templates select="node(), key('oid', @oid, /t:object)!(name)"/>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="/t:object/apti:object">
    <node>
    <name><xsl:value-of select="c:name"/></name>
    <xsl:copy-of select="key('oid', @oid, /t:object)!(name)"/>
    </node>
    </xsl:template>       
    </xsl:stylesheet>

但是我无法获得带有模板的父节点的名称。我已经尝试搜索所有的节点,条件是有一个条件,但它似乎不工作。

请帮帮忙

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-17 14:46:49

您所显示的输出类型可以很容易地使用以下方法生成:

XSLT2.0

代码语言:javascript
运行
复制
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3"
xmlns:apti="http://midpoint.evolveum.com/xml/ns/public/common/api-types-3"
exclude-result-prefixes="t apti">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="parent" match="apti:object" use="@oid" />

<xsl:template match="/t:object">
    <root>
        <xsl:for-each select="apti:object">
            <node>
                <name>
                    <xsl:value-of select="name"/>
                </name>
                <parent>
                    <xsl:value-of select="key('parent', parentOrgRef/ @oid)/name"/>
                </parent>
            </node>
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>

Demohttps://xsltfiddle.liberty-development.net/3MEdvi4

请注意,您的XML包含一个默认名称空间声明,该声明将所有未前缀的元素都放在名称空间中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66675022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档