XPATH 1.0根据条件构造一个新的xml文档

时间:2014-11-19 15:49:34

标签: xml xpath

我有一个像这样的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

2 个答案:

答案 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>