我想检索具有子节点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数据非常冗长,我不想压倒帖子。我也在努力克服格式化规则。
答案 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]