Изменить атрибут конкретных узлов в любом месте XML - PullRequest
0 голосов
/ 14 октября 2019

Мне нужно изменить свой XML-файл, установив атрибут "id" некоторых узлов в их положение во всем документе. Вот пример:

Мой входной XML-файл

<root>
  <exampleParent>
    <exampleNode id="">
      <!--Some stuff-->
    </exampleNode>
    <exampleNode id="">
      <!--Some stuff-->
    </exampleNode>
  </exampleParent>
  <exampleParent>
    <exampleNode id="">
      <!--Some stuff-->
    </exampleNode>
  </exampleParent>
</root>

Ожидаемый результат

<root>
  <exampleParent>
    <exampleNode id="exampleNode1">
      <!--Some stuff-->
    </exampleNode>
    <exampleNode id="exampleNode2">
      <!--Some stuff-->
    </exampleNode>
  </exampleParent>
  <exampleParent>
    <exampleNode id="exampleNode3">
      <!--Some stuff-->
    </exampleNode>
  </exampleParent>
</root>

Моя основная трудность заключается вчто "exampleNode" не все находятся под одним и тем же родителем, но находятся по всему документу. Мне удалось изменить параметр «id» каждого «exampleNode», но я могу установить для него только определенное значение и не могу сосчитать их все.

Мой XSL-код

<xsl:variable name="prefixId" select="'exampleNode" />

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

<xsl:template name="setId">
    <xsl:param name="nb"/>

    <xsl:attribute name="id">
        <xsl:value-of select="concat($prefixId, $nb)"/>
    </xsl:attribute>
</xsl:template>

<xsl:template match="exampleNode/@id">
    <xsl:call-template name="setId">
        <xsl:with-param name="nb"><xsl:value-of select="generate-id()"/></xsl:with-param>
    </xsl:call-template>
    <xsl:apply-templates select="child::node()"/>
</xsl:template>

Этот код будет генерировать уникальный идентификатор для каждого, но как я могу изменить это, чтобы этот идентификатор отражал порядок появления «exampleNode» в документе?

1 Ответ

0 голосов
/ 14 октября 2019

Использование <xsl:number count="exampleNode" level="any"/>:

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

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


  <xsl:template match="exampleNode/@id">
      <xsl:attribute name="{name()}"><xsl:value-of select="local-name(..)"/><xsl:number count="exampleNode" level="any"/></xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...