簡體   English   中英

XPATH 計算祖先中子節點的出現次數

[英]XPATH to count the occurrence of child nodes in ancestor

我需要計算<foreword><?>元素<foreword><?> <title>節點的出現次數。 我的問題是<title>元素的父節點有不同的名稱,但它們都有<title>元素。

我嘗試使用count(*)但這不起作用,它返回“0”。 如果我使用count(/doc/front/foreword/*/title)它返回'16'。 如何計算<foreword><?>元素中<title>元素的出現次數?

    <doc>
    <front>
    <lep></lep>
    <verstat></verstat>
    <contents></contents>
    <illuslist></illuslist>
    <tablelist></tablelist>
    <foreword>
    <para0><title>para0</title></para0>
    <applicdef><title>applicdef</title></applicdef>
    <applicdef><title>applicdef</title></applicdef>
    <applicdef><title>applicdef</title></applicdef>
    <applicdef><title>applicdef</title></applicdef>
    <applicdef><title>applicdef</title></applicdef>
    <para0><title>para0</title></para0>
    <para0><title>para0</title></para0>
    <para0><title>para0</title></para0>
    <para0><title>para0</title></para0>
    </foreword>
    </front>
    </doc>

我用應該顯示的數字對title元素進行了編號(1.0 目的,2. 應用...等。

所以輸出會像

    <para0><title>1. para0</title></para0>
    <applicdef><title>2.applicdef</title></applicdef>
    <applicdef><title>3.applicdef</title></applicdef>
    <applicdef><title>4.applicdef</title></applicdef>
    <applicdef><title>5.applicdef</title></applicdef>
    <applicdef><title>6.applicdef</title></applicdef>

讓我們使用您的真實生活場景,即 XSLT。 這是使用身份轉換的解決方案。

輸入 XML

<?xml version="1.0"?>
<doc>
    <front>
        <lep></lep>
        <verstat></verstat>
        <contents></contents>
        <illuslist></illuslist>
        <tablelist></tablelist>
        <foreword>
            <para0>
                <title>para0</title>
            </para0>
            <applicdef>
                <title>applicdef</title>
            </applicdef>
            <applicdef>
                <title>applicdef</title>
            </applicdef>
            <applicdef>
                <title>applicdef</title>
            </applicdef>
            <applicdef>
                <title>applicdef</title>
            </applicdef>
            <applicdef>
                <title>applicdef</title>
            </applicdef>
            <para0>
                <title>para0</title>
            </para0>
            <para0>
                <title>para0</title>
            </para0>
            <para0>
                <title>para0</title>
            </para0>
            <para0>
                <title>para0</title>
            </para0>
        </foreword>
    </front>
</doc>

XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="title">
        <title>
            <xsl:value-of select="concat(count(../preceding-sibling::*)+1,'. ', .)"/>
        </title>
    </xsl:template>
</xsl:stylesheet>

輸出

<doc>
  <front>
    <lep/>
    <verstat/>
    <contents/>
    <illuslist/>
    <tablelist/>
    <foreword>
      <para0>
        <title>1. para0</title>
      </para0>
      <applicdef>
        <title>2. applicdef</title>
      </applicdef>
      <applicdef>
        <title>3. applicdef</title>
      </applicdef>
      <applicdef>
        <title>4. applicdef</title>
      </applicdef>
      <applicdef>
        <title>5. applicdef</title>
      </applicdef>
      <applicdef>
        <title>6. applicdef</title>
      </applicdef>
      <para0>
        <title>7. para0</title>
      </para0>
      <para0>
        <title>8. para0</title>
      </para0>
      <para0>
        <title>9. para0</title>
      </para0>
      <para0>
        <title>10. para0</title>
      </para0>
    </foreword>
  </front>
</doc>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM