首页 > 解决方案 > XSLT 仅在出现任何子节点时立即调用

问题描述

我有两个可能的输入 XML,如下所示。我希望仅获取父母帐户信息并忽略下的帐户<line>

尝试使用//accountand .//account,两者都返回所有帐户段,因此每个 xml 的计数分别为 2 和 4。期望计数是 1 和 2<account>

xml1:

<?xml version="1.0" encoding="UTF-8"?>
<inventory>
  <account>
    <seg1>123</seg1>
    <seg2>qwe</seg2>
  </account>
  <line>
    <account>
      <seg1>123</seg1>
      <seg2>qwe</seg2>
    </account>
  </line>
</inventory>

xml2:

<?xml version="1.0" encoding="UTF-8"?>
<inventory>
  <accounts>
    <account>
        <seg1>123</seg1>
        <seg2>qwe</seg2>
    </account>
    <account>
        <seg1>456</seg1>
        <seg2>abc</seg2>
    </account>
</accounts>
  <line>
    <accounts>
        <account>
            <seg1>123</seg1>
            <seg2>qwe</seg2>
        </account>
        <account>
            <seg1>456</seg1>
            <seg2>abc</seg2>
        </account>
    </accounts>
 </line>
</inventory>

所以我希望只读取即时帐户信息并忽略<line>段下的帐户

标签: xmlxsltxslt-2.0

解决方案


要同时满足 xml 1 和 2,请使用

[not(ancestor-or-self::line)]

这是xslt

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <inventory>
            <xsl:copy-of select="//*[not(ancestor-or-self::line)]/account"/>       
        </inventory>
    </xsl:template>
</xsl:stylesheet>

推荐阅读