Перенос идентификаторов и ссылки на идентификаторы в XML - PullRequest
0 голосов
/ 13 ноября 2009

Я пытаюсь объединить элементы xml друг в друга, и у меня возникает проблема, когда есть одинаковые идентификаторы. По сути, мне нужно изменить все идентификаторы в XML-файле, а также ссылки на них. (Я делаю это с SVG, чтобы добавить немного контекста)

Скажи, что у меня есть:

<bar id="foo"/>
<baz ref="url(#foo)"/>
<bar id="abc"/>
<baz ref="asdf:url(#abc)"/>

Я бы хотел, чтобы это автоматически превратилось во что-то вроде:

<bar id="foo_1"/>
<baz ref="url(#foo_1)"/>
<bar id="abc_1"/>
<baz ref="asdf:url(#abc_1)"/>

или что-то подобное.

Я, вероятно, могу написать какой-нибудь XSL для этого, но надеялся, что есть более простой способ.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 ноября 2009

Если вы в конечном итоге используете XSLT, вы можете найти функцию generate-id, полезную для генерации идентификаторов.

Вот своего рода фиктивный пример использования XSLT 1.0:

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

  <xsl:key name="element-by-id" match="//*" use="@id"/>

  <!-- identity transform: everything as-is... -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- ... except for rewritten id's -->
  <xsl:template match="@id">
    <xsl:attribute name="id">
      <xsl:value-of select="generate-id(..)"/>
    </xsl:attribute>
  </xsl:template>

  <!-- ... and rewritten id references -->
  <xsl:template match="@ref">
    <xsl:variable name="head" select="substring-before(., 'url(#')"/>
    <xsl:variable name="tail" select="substring-after(., 'url(#')"/>
    <xsl:variable name="idref" select="substring-before($tail, ')')"/>
    <xsl:variable name="end" select="substring-after($tail, ')')"/>
    <xsl:attribute name="ref">
      <xsl:value-of select="concat($head, 'url(#', 
                            generate-id(key('element-by-id', $idref)), 
                            ')', $end)"/>
    </xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

Если вам не нравится идентификатор, созданный generate-id (или если вы не можете использовать его по другим причинам - чтобы гарантировать, что вы получите уникальный идентификатор, все узлы, которые необходимо обработать в рамках одного и того же преобразования), вы можете заменить вызовы к нему с другой логикой, например добавление суффикса.

0 голосов
/ 13 ноября 2009

Не очень элегантное решение, но вы всегда можете использовать некоторые регулярные выражения.

Совпадение на id=(.*) и затем замените все # $ 1 на все, что вы хотите.

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