当前位置: 首页 > 知识库问答 >
问题:

XSLT基于多个条件显示XML

农飞翔
2023-03-14
<Data>
<Record Id="1826155" username="BobDylan" >
    <ART id="121028890624">
        <TYPE>Song</TYPE>
        <AUTH>
            <AUTHOR_ID>1826155</AUTHOR_ID>
            <FNAME>Bob</FNAME>
            <LNAME>Dylan</LNAME>
            <HIDE/>
        </AUTH>
        <AUTH>
            <AUTHOR_ID>175782</AUTHOR_ID>
            <FNAME>Frank</FNAME>
            <LNAME>Sinatra</LNAME>
            <HIDE>true</HIDE>
        </AUTH>
        <STATUS>Published</STATUS>
        <TITLE>A Cool Song </TITLE>
    </ART>
    <ART id="123840712342">
        <TYPE>Song</TYPE>
        <AUTH>
            <AUTHOR_ID>1826155</AUTHOR_ID>
            <FNAME>Bob</FNAME>
            <LNAME>Dylan</LNAME>
            <HIDE>true</HIDE>
        </AUTH>
        <AUTH>
            <AUTHOR_ID>175782</AUTHOR_ID>
            <FNAME>Tom</FNAME>
            <LNAME>Waits</LNAME>
        </AUTH>
        <STATUS>Published</STATUS>
        <TITLE>New Song</TITLE>
    </ART>
    <ART id="123840737280">
        <TYPE>Book</TYPE>
        <AUTH>
            <AUTHOR_ID>1826155</AUTHOR_ID>
            <FNAME>Bob</FNAME>
            <LNAME>Dylan</LNAME>
            <HIDE/>
        </AUTH>
        <AUTH>
            <AUTHOR_ID>175782</AUTHOR_ID>
            <FNAME>Tom</FNAME>
            <LNAME>Wolfe</LNAME>
        </AUTH>
        <STATUS>Accepted</STATUS>
        <TITLE>New Book</TITLE>
    </ART>
</Record>
</Data>

我试图通过选择符合以下条件的歌曲节点来转换上述XML:

  1. 状态='已发布'
  2. 如果匹配Data/Record/@Id的 /AUTH/AUTHOR_ID的AUTH/HIDE值为true,则不显示ART/TYPE(在这种情况下,Id=1826155)

所需的XML输出应包括Type、所有作者和标题。第二个歌曲类型在此示例中隐藏(因为HIDE=true对于主要作者):

<h3>Songs</h3>
<div>
 <ul>
  <li>Bob Dylan, Frank Sinatra; A Cool Song</li>
 </ul>
</div>

我开始尝试每种方法,但发现我无法显示与记录Id不匹配的作者。根据建议,我认为最好使用模板。我有一些XSLT工作不正常,而是显示所有数据,而不是子集。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
  <xsl:output method="html" encoding="utf-8" />
  <xsl:variable name="userId" select="dm:Data/dm:Record/@userId"/>

    <xsl:template match="/Data/Record/ART[TYPE='Song']">
   <xsl:apply-templates select= "/Data/Record/ART[CONTYPE='Song']/AUTH[AUTHOR_ID = $userId]" />
  </xsl:template>

 <xsl:template match="/Data/Record/ART[TYPE='Song']">
    <xsl:apply-templates select= "/Data/Record/ART[TYPE='Song']/AUTH[/STATUS = 'PUBLISHED']" />
 </xsl:template>

 <xsl:template match="/Data/Record/ART[TYPE='Song']">
      <xsl:value-of select="./FNAME"/> <xsl:text> </xsl:text>
      <xsl:value-of select="./LNAME"/> <xsl:text> </xsl:text>
      <xsl:value-of select="./TITLE"/> <xsl:text> </xsl:text>
 </xsl:template>

</xsl:stylesheet>

共有2个答案

申奇希
2023-03-14

这应该行得通。

第一个匹配查找记录并将id存储在recId变量中。然后,它使用此变量将匹配应用于具有该id和您指定的其他参数的ART。您提供的示例XML没有名称空间,因此我将其删除。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
  <xsl:output method="html" encoding="utf-8" />

<xsl:template match="/Data/Record">
   <xsl:variable name="recId" select="@Id"/>

   <xsl:apply-templates select="ART[TYPE='Song' and STATUS='Published' and AUTH/AUTHOR_ID=$recId and AUTH/HIDE!='true']" />
</xsl:template>

 <xsl:template match="Data/Record/ART">
   <xsl:value-of select="TITLE"/>
   <xsl:value-of select="AUTH/FNAME"/>
   <xsl:value-of select="AUTH/LNAME"/>

 </xsl:template>

</xsl:stylesheet>
聂鹏云
2023-03-14

我开始尝试每一个,但发现我无法处理显示与记录Id不匹配的作者。

为什么不呢?

<xsl:for-each select="/Data/Record/ART/AUTH[AUTHOR_ID = ancestor::Record/@Id]">

将仅选择其AUTHOR\u ID与其记录ID匹配的作者。

要将其缩小到仅限已发布歌曲的作者,您可以使用:

<xsl:for-each select="/Data/Record/ART[TYPE = 'Song' and STATUS = 'Published']/AUTH[AUTHOR_ID = ancestor::Record/@Id]">

要进一步排除隐藏作者:

<xsl:for-each select="/Data/Record/ART[TYPE = 'Song' and STATUS = 'Published']/AUTH[AUTHOR_ID = ancestor::Record/@Id and not(HIDE='true')]">

当然,您也可以将相同的谓词用于xsl:apply-templates。

针对您的编辑:

我仍然觉得这些要求令人困惑。我想你应该这样做:

XSLT 1.0

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

<xsl:template match="/Data">
    <h3>Songs</h3>
    <div>
        <xsl:for-each select="Record/ART[TYPE = 'Song' and STATUS = 'Published' and not(parent::Record/@Id = AUTH[HIDE='true']/AUTHOR_ID)]">
            <ul>
                <li>
                    <xsl:for-each select="AUTH">
                        <xsl:value-of select="FNAME"/> 
                        <xsl:text> </xsl:text>
                        <xsl:value-of select="LNAME"/> 
                        <xsl:if test="position()!=last()">
                            <xsl:text>, </xsl:text>
                        </xsl:if>
                    </xsl:for-each>
                    <xsl:text>; </xsl:text>
                    <xsl:value-of select="TITLE"/> 
                </li>
            </ul>
        </xsl:for-each>
    </div>
</xsl:template>

</xsl:stylesheet>

这将选择满足所有这些条件的每个ART:

>

  • 类型='歌曲';

    状态='已发布';

    没有一个作者同时具有(a)与祖先的记录ID匹配的AUTHOR\u ID和(b)HIDE=“True”。

    对于每一件这样的艺术品,其所有作者都将被列出,并附上艺术品的标题:

    结果

    <h3>Songs</h3><div>
      <ul>
        <li>Bob Dylan, Frank Sinatra; A Cool Song </li>
      </ul>
    </div>  
    

  •  类似资料:
    • 我被困在我的项目上,我还有两天的时间,所以我希望你们能帮助我。 我的JFrame"UserManager"显示用户的信息,这些信息是: 姓名、地址、电话号码等 当我必须显示BankAccount对象时,我的问题就来了:因为每个用户都可以拥有无限数量的银行账户——每个账户都存储在一个名为“ownedAccounts”的Arraylist中——我想在JFrame中创建小面板。 实例化JPanel并不是

    • 我正在使用下面的XSLT- 可以有人请检查XSLT代码,帮助我得到想要的结果。当前,我得到以下错误数组([type]=>2[message]=>XSLTProcessor::TransformToxML():没有与此对象关联的样式表[file]=>/var/www/html/online-toolz.com/functions/xslt.php[line]=>26)错误:XSLTProcessor

    • 我试图为数据集创建多水平条形图。这些数据涉及跑步比赛的比赛时间。 Dataframe有以下列:名称、年龄组、完成时间、完成地点、家乡。下面是示例数据。 我想创建一个类似下图的条形图。每个年龄组将有一个条形图,最快的跑步者在图表的底部,跑步者的名字与城市和次数跑了比赛低于他们的名字。 我需要一个for循环还是一个简单的groupby工作?每个年龄组的数量和大小可以根据种族动态变化,因此它不是一个常数

    • 基于“SC”代码,我需要将SRCTable与RefTable-1或RefTable-2连接起来 条件:如果SC为“D”,则SRCTable在KEY=KEY1上与RefTable-1连接以获得值。否则,如果SC为“U”,则SRCTable与键=键2上的RefTable-2连接 这是输入spark数据帧。 预期产出: 注意:输入表将有数百万条记录,因此需要一个优化的解决方案

    • 下面的代码是一个分类法模板(taxonomy-city.php),在每篇文章中,我有两个分类法城市和地区。 我试图展示与城市共享同一地区的帖子。例如,如果我在伦敦的网页上,我想展示选择了欧洲分类术语的其他城市。

    • 这是表格的样子: 状态类别列表:(跟踪、批准、审核、接收、测试、关闭) 条件: