Используйте xslt для идентификации дублирующихся элементов в файле xml - PullRequest
0 голосов
/ 09 марта 2020

Мне нужно использовать xslt, чтобы идентифицировать и перечислить все повторяющиеся элементы в файле xml на основе родительского ярлыка // field @ name = "partya". Есть ли простой способ добиться этого? xml указано ниже.

    <table>
    <entry>
     <display>
        <field name="partya">
           <label>Abi</label>
        </field>
        <field name="partyb">
           <label>Seddon</label>
        </field>
        <field name="validation-type">
           <label>auto-valid</label>
        </field>
       ...
  </entry>
  <entry>
     <display>
        <field name="partya">
           <label>Abi</label>
        </field>

1 Ответ

0 голосов
/ 09 марта 2020

В XSLT 2 или 3 вы можете сгруппировать эти label элементы и проверить, есть ли более чем один элемент в current-group():

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:output method="text" item-separator="&#10;"/>

  <xsl:template match="/">
      <xsl:for-each-group select="//field[@name = 'partya']/label" group-by=".">
          <xsl:if test="tail(current-group())">
              <xsl:value-of select="."/>
          </xsl:if>
      </xsl:for-each-group>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/ehVZvvA

В XSLT 1 вы можете использовать мюнхенскую группировку и проверить, существует ли более одного элемента в группе:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:output method="text"/>

  <xsl:key name="group" match="field[@name = 'partya']/label" use="."/>

  <xsl:template match="/">
      <xsl:apply-templates select="//field[@name = 'partya']/label[key('group', .)[2]][generate-id() = generate-id(key('group', .)[1])]"/>
  </xsl:template>

  <xsl:template match="label">
      <xsl:if test="position() > 1">&#10;</xsl:if>
      <xsl:value-of select="."/>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/ehVZvvA/1

...