Xml 是否可以使用XSLT跳过层次结构中的某个级别?
层次结构是XML格式的,我正在使用XSLT转换数据 例如:如果层次结构有4个级别,而我想跳过中间的一个级别(例如级别3): 我应该使用什么元素来实现相同的目标 附加作为参考输入的示例XML文件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 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:我已经更新了您提到的问题