返回子节点名称与多个

时间:2018-02-15 15:47:23

标签: xslt parent children

我想检索具有子节点childTypeA,childTypeB或childTypeC的任何Node,但不返回仅包含其他子节点的节点(如stepChildA)。 一旦我拥有该节点,我就可以检索任何子节点及其属性。但我无法弄清楚如何过滤掉那些没有匹配childTypeA,childTypeB或childTypeC的子节点的节点。 我的努力要么返回带子节点的所有节点,要么为每个匹配的子节点返回一个节点,这意味着同一个节点返回一次,两次或三次,具体取决于是否有一个,两个或所有三个所需的子节点。 / p>

使用如图所示的xml数据

<parent Name="Item one">
    <OtherData Name="Data one">
    <childTypeA>
        <someData Name="Child A">
    </childTypeA>
    <childTypeB>
        <someData Name="Child B">
    </childTypeB>
</parent>
<parent Name="Item two">
    <OtherData Name="Data two">
    <childTypeB>
        <someData Name="Child B">
    </childTypeB>
    <childTypeC>
        <someData Name="Child C">
    </childTypeC>
</parent>
<parent Name="Item three">
    <OtherData Name="Data three">
    <stepChildA>
        <someData Name="Step Child A">
    </stepChildA>
</parent>

每种子类型下的实际数据是不同的,我试图将它组装到一个表中,其中具有所需子类型的每个父节点出现在一行中,子数据对齐在适当的列下。目前,我要么所有父节点都按预期显示所需的数据,但也包含其他没有数据的父节点的行,或者当有多个所需子节点时,我得到多行类型。特定的子类型数据属于正确的列,但不在一行上。

我的方法是正确的,但我需要重新订购我的代码。我有&#34;如果测试&#34;在&#34; for-each&#34;之前。通过交换它们,我能够返回所有父节点,但是然后使用&#34; xsl:if test = ...&#34;在我解析子节点时忽略不需要的父节点并构建每个表行。注意我根据属性@Name。

的值为返回的父节点添加了一个排序
<xsl:for-each select="parent">
    <xsl:sort select="@Name">
    <xsl:if test="childTypeA or childTypeB or childTypeC">
        <tr>.........</tr>
    </xsl:if>
</xsl:for-each>

我的XML数据非常冗长,我不想压倒帖子。我也在努力克服格式化规则。

1 个答案:

答案 0 :(得分:0)

据我所知,你只需要像这样使用xpath public class FetchTagTest { @Rule public final TemporaryFolder tempFolder = new TemporaryFolder(); private Git remote; private Git local; @Before public void setUp() throws Exception { File remoteDirectory = tempFolder.newFolder( "remote" ); File localDirectory = tempFolder.newFolder( "local" ); remote = Git.init().setDirectory( remoteDirectory ).call(); local = Git.cloneRepository().setURI( remoteDirectory.getCanonicalPath() ).setDirectory( localDirectory ).call(); } @After public void tearDown() { local.getRepository().close(); remote.getRepository().close(); } @Test public void testFetchTag() throws Exception { remote.commit().setMessage( "tag me!" ).call(); Ref remoteTag = remote.tag().setName( "tag" ).call(); local.fetch() .setRemote( remote.getRepository().getDirectory().getCanonicalPath() ) .setRefSpecs( new RefSpec( "refs/tags/tag:refs/tags/tag" ) ) .call(); List<Ref> localTags = local.tagList().call(); assertEquals( 1, localTags.size() ); assertEquals( remoteTag.getName(), localTags.get( 0 ).getName() ); assertEquals( remoteTag.getObjectId(), localTags.get( 0 ).getObjectId() ); } }

parent[childTypeA | childTypeB | childTypeC]