我有一个像这样的xml文档:
<dataContainerList>
<Container>
<LocalDataContainer>
<file>InputFile3</file>
</LocalDataContainer>
</Container>
<Container>
<LocalDataContainer>
<file>InputFile2</file>
</LocalDataContainer>
</Container>
<Container>
<LocalDataContainer>
<file>InputFile3</file>
</LocalDataContainer>
</Container>
</dataContainerList>
我想用文件 name = InputFile3
过滤掉所有容器意味着:我想用唯一的第一个和第三个容器创建一个新的 dataContainereList 。
使用一个XPATH1.0
命令可以实现吗?无法使用XSL
或其他内容,只需XPath
这应该适用于任意 dataContainerList 。
答案 0 :(得分:1)
简而言之,没有。 XPath允许您过滤Container
元素,但无法输出或更新结果。
为此您可以使用XQuery 1.0处理器。例如,这有效:
<dataContainerList> {
doc("file.xml")//Container[./LocalDataContainer/file != 'InputFile2']
}
</dataContainerList>
答案 1 :(得分:1)
根据您的描述,听起来不是过滤掉Containers
名为&#34; InputFile3&#34;,您实际上想要选择此类容器。
您可以在XSLT中使用身份转换的简单变体将所有内容复制到输出,但那些未命名的Containers
&#34; InputFile3&#34;。
此输入XML:
<?xml version="1.0" encoding="UTF-8"?>
<Containers>
<Container>
<LocalDataContainer>
<file>InputFile3</file>
</LocalDataContainer>
</Container>
<Container>
<LocalDataContainer>
<file>InputFile2</file>
</LocalDataContainer>
</Container>
<Container>
<LocalDataContainer>
<file>InputFile3</file>
</LocalDataContainer>
</Container>
</Containers>
应用于此XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Container[LocalDataContainer/file != 'InputFile3']"/>
</xsl:stylesheet>
会产生此输出XML:
<?xml version="1.0" encoding="UTF-8"?>
<Containers>
<Container>
<LocalDataContainer>
<file>InputFile3</file>
</LocalDataContainer>
</Container>
<Container>
<LocalDataContainer>
<file>InputFile3</file>
</LocalDataContainer>
</Container>
</Containers>