<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:
所需的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>
这应该行得通。
第一个匹配查找记录并将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>
我开始尝试每一个,但发现我无法处理显示与记录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),在每篇文章中,我有两个分类法城市和地区。 我试图展示与城市共享同一地区的帖子。例如,如果我在伦敦的网页上,我想展示选择了欧洲分类术语的其他城市。
这是表格的样子: 状态类别列表:(跟踪、批准、审核、接收、测试、关闭) 条件: