gpt4 book ai didi

xml - XSL 根据其他节点的值查找节点 + 多级排序

转载 作者:数据小太阳 更新时间:2023-10-29 02:31:42 24 4
gpt4 key购买 nike

基本上我需要弄清楚两件事:

  1. 多级排序
  2. 在我放置 ??? 的第三层:如何选择另一个 <term>其中有 <title>等于 <narrowerterm>当前的 <term> .

我希望这已经足够清楚了。我已经有一段时间找不到我需要的东西了。

我的 XML(摘录):

<thesaurus>
<term>
<title>defense</title>
<narrowerterm>defense skills</narrowerterm>
<narrowerterm>defense actions</narrowerterm>
</term>
<term>
<title>defense skills</title>
<broaderterm>defense</broaderterm>
<narrowerterm>skill cd</narrowerterm>
<narrowerterm>skill xy</narrowerterm>
<narrowerterm>skill ab</narrowerterm>
</term>
<term>
<title>defense actions</title>
<broaderterm>defense</broaderterm>
<narrowerterm>actions against xy</narrowerterm>
<narrowerterm>actions against ab</narrowerterm>
</term>
</thesaurus>

我的 XSL:

<xsl:template match="thesaurus">
<html>
<body>
<xsl:for-each-group select="term" group-by="title">
<xsl:sort select="title"/>
<xsl:choose>
<xsl:when test="broaderterm">
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="use">
</xsl:when>
<xsl:otherwise>
<p>
<xsl:value-of select="current-grouping-key()"/><br/>
<xsl:for-each select="narrowerterm">
.<xsl:value-of select="."/><br/>
<xsl:for-each select="???"/>
..<xsl:value-of select="narrowerterm"/><br/>
</xsl:for-each>
</xsl:for-each>
</p>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</body>
</html>
</xsl:template>

我想要的是:

defense
.defense actions
..actions against ab
..actions against xy
.defense skills
..skill ab
..skill cd
..skill xy

我所在的位置:

defense
.defense skills
.defense actions

最佳答案

我认为这不是分组任务,也不需要 XSLT 2.0。

这个转换:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/*">
<xsl:apply-templates select="term[not(broaderterm)]">
<xsl:with-param name="pIndent" select="''"/>
<xsl:sort select="title"/>
</xsl:apply-templates>
</xsl:template>

<xsl:template match="term">
<xsl:param name="pIndent"/>
<xsl:value-of select="concat($pIndent, title, '&#xA;')"/>

<xsl:variable name="vSubterms" select=
"../term[broaderterm = current()/title]"/>

<xsl:variable name="vLeafSubterms" select=
"narrowerterm[not(. = /*/term[broaderterm = current()/title]/title)]"/>

<xsl:apply-templates select="$vSubterms | $vLeafSubterms">
<xsl:with-param name="pIndent" select="concat($pIndent, '.')"/>
<xsl:sort select="concat(self::term/title, self::narrowerterm/text())"/>
</xsl:apply-templates>
</xsl:template>

<xsl:template match="narrowerterm">
<xsl:param name="pIndent"/>
<xsl:value-of select="concat($pIndent, ., '&#xA;')"/>
</xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<thesaurus>
<term>
<title>defense</title>
<narrowerterm>defense skills</narrowerterm>
<narrowerterm>defense actions</narrowerterm>
</term>
<term>
<title>defense skills</title>
<broaderterm>defense</broaderterm>
<narrowerterm>skill cd</narrowerterm>
<narrowerterm>skill xy</narrowerterm>
<narrowerterm>skill ab</narrowerterm>
</term>
<term>
<title>defense actions</title>
<broaderterm>defense</broaderterm>
<narrowerterm>actions against xy</narrowerterm>
<narrowerterm>actions against ab</narrowerterm>
</term>
</thesaurus>

产生想要的、正确的结果:

defense
.defense actions
..actions against ab
..actions against xy
.defense skills
..skill ab
..skill cd
..skill xy

关于xml - XSL 根据其他节点的值查找节点 + 多级排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9602460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com