Xml 是否可以使用XSLT跳过层次结构中的某个级别?

Xml 是否可以使用XSLT跳过层次结构中的某个级别?,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,层次结构是XML格式的,我正在使用XSLT转换数据 例如:如果层次结构有4个级别,而我想跳过中间的一个级别(例如级别3): 我应该使用什么元素来实现相同的目标 附加作为参考输入的示例XML文件 <?xml version="1.0" encoding="UTF-8"?> <Hierarchy> <Board> <Name>President</Name>

层次结构是XML格式的,我正在使用XSLT转换数据

例如:如果层次结构有4个级别,而我想跳过中间的一个级别(例如级别3):

我应该使用什么元素来实现相同的目标

附加作为参考输入的示例XML文件

  <?xml version="1.0" encoding="UTF-8"?>
<Hierarchy>
    <Board>
        <Name>President</Name>
        <Id>ABCDE</Id>
        <ParentId></ParentId>
        <General>
            <Name>President</Name>
            <Description>Top level of the Hierarchy</Description>
            <Template>LEVEL1</Template>
        </General>
    </Board>
    <Board>
        <Name>VP</Name>
        <Id>EFGHI</Id>
        <ParentId>ABCDE</ParentId>
        <General>
            <Name>VP</Name>
            <Description>Below the President</Description>
            <Template>LEVEL2</Template>
        </General>
    </Board>
    <Board>
        <Name>Department_Heads</Name>
        <Id>JKLMN</Id>
        <ParentId>EFGHI</ParentId>
        <General>
            <Name>Department_Heads</Name>
            <Description>Reports to the VP</Description>
            <Template>LEVEL3</Template>
        </General>
    </Board>
    <Board>
        <Name>Supervisors</Name>
        <Id>OPQRS</Id>
        <ParentId>JKLMN</ParentId>
        <General>
            <Name>Supervisors</Name>
            <Description>Reports to the Reports to Dep Heads</Description>
            <Template>LEVEL4</Template>
        </General>
    </Board>
    <Board>
        <Name>Employees</Name>
        <Id>TUVWX</Id>
        <ParentId>OPQRS</ParentId>
        <General>
            <Name>Department_Heads</Name>
            <Description>Reports to the Reports to Dep Heads</Description>
            <Template>LEVEL5</Template>
        </General>
    </Board>
</Hierarchy>

总统
ABCDE
总统
层次结构的顶层
一级
副总裁
埃夫吉
ABCDE
副总裁
在总统之下
二级
部门主管
JKLMN
埃夫吉
部门主管
向副总裁汇报
三级
主管
OPQRS
JKLMN
主管
向副总裁汇报
四级
员工
凝灰岩
OPQRS
部门主管
向副总裁汇报
五级
更新:我正在添加预期的输出和当前使用的xslt转换

预期产出如下:

<?xml version="1.0" encoding="utf-8"?>
<Hierarchy>
  <Board>
    <Name>President</Name>
    <Template>PRESIDENT</Template>
    <Description>Top level of the Hierarchy</Description>
    <Board>
    <Name>VP</Name>
    <Template>VICE_PRESIDENT</Template>
    <Description>Below the President</Description>
    </Board>
   </Board>
</Hierachy>
我当前使用的转换如下所示:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <Hierarchy>
            <xsl:for-each select="Hierarchy/Board">

                <xsl:if test="General/Template='LEVEL1'">
                    <xsl:variable name="Presidentchild" select="Id"/>
                    <Board>
                        <Name>
                            <xsl:value-of select="Name"/>
                        </Name>
                        <Template>PRESIDENT</Template>
                        <Description>
                            <xsl:value-of select = "General/Description"/>
                        </Description>
                    </Board>
                </xsl:if>
            </xsl:for-each>
            <xsl:for-each select="//Board">
                <xsl:if test="ParentId = $Presidentchild">
                    <xsl:if test="General/Template='LEVEL2'">
                        <Board>
                            <xsl:variable name="VPchild" select="Id"/>
                            <Name>
                                <xsl:value-of select="Name"/>
                            </Name>
                            <Template>VICE_PRESIDENT</Template>
                            <Description>
                                <xsl:value-of select = "General/Description"/>
                            </Description>
                        </Board>
                    </xsl:if>
                </xsl:if>
            </xsl:for-each>
        </Hierarchy>
    </xsl:template>
</xsl:stylesheet>

总统
副校长
……一直到最后一个元素

预期输出如下:

<?xml version="1.0" encoding="utf-8"?>
<Hierarchy>
  <Board>
    <Name>President</Name>
    <Template>PRESIDENT</Template>
    <Description>Top level of the Hierarchy</Description>
    <Board>
    <Name>VP</Name>
    <Template>VICE_PRESIDENT</Template>
    <Description>Below the President</Description>
    </Board>
   </Board>
</Hierachy>

总统
总统
层次结构的顶层
副总裁
副校长
在总统之下

。。。一直到最后一个元素。

在对你的问题的评论中,我说这是相当琐碎的。这是因为我认为您的输入XML具有层次结构。事实证明,需要通过跟踪每个
到其父级的交叉引用来派生层次结构

尽管如此,由于每个
还包括一个(命名错误的)
模板
元素,指示其在层次结构中的级别,因此很容易“跳过”某些级别,例如以下样式表中的
LEVEL3

XSLT1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="children" match="Board" use="ParentId" />

<xsl:template match="/Hierarchy">
    <xsl:copy>
        <xsl:apply-templates select="Board[General/Template='LEVEL1']"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="Board">
    <xsl:copy>
        <xsl:copy-of select="General/*"/>
        <xsl:apply-templates select="key('children', Id)"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="Board[General/Template='LEVEL3']">
    <xsl:apply-templates select="key('children', Id)"/>
</xsl:template>

</xsl:stylesheet>

应用于您的输入示例,这将产生:

结果

<?xml version="1.0" encoding="UTF-8"?>
<Hierarchy>
  <Board>
    <Name>President</Name>
    <Description>Top level of the Hierarchy</Description>
    <Template>LEVEL1</Template>
    <Board>
      <Name>VP</Name>
      <Description>Below the President</Description>
      <Template>LEVEL2</Template>
      <Board>
        <Name>Supervisors</Name>
        <Description>Reports to the Reports to Dep Heads</Description>
        <Template>LEVEL4</Template>
        <Board>
          <Name>Department_Heads</Name>
          <Description>Reports to the Reports to Dep Heads</Description>
          <Template>LEVEL5</Template>
        </Board>
      </Board>
    </Board>
  </Board>
</Hierarchy>

总统
层次结构的顶层
一级
副总裁
在总统之下
二级
主管
向副总裁汇报
四级
部门主管
向副总裁汇报
五级

请发布一个示例,显示输入示例、预期输出和您当前的尝试。-提示:如果您从标识转换模板开始,并为您想要“跳过”的级别添加覆盖模板,那么这是非常简单的,该模板除了将模板应用于上下文元素的子级之外,什么都不做。@michael.hor257k:我已经更新了您提到的问题