скопируйте xml в другой файл, но изменив атрибут узла и атрибуты ребра - PullRequest
0 голосов
/ 29 марта 2011

у меня есть xml с форматом

<graph id=1>
  <nodes>
   <node id =2>
    <name value=node1/>
   </node>
   <node id =3>
    <name value=node3/>
   </node>
   <edges>
     <edge id=11 source=2 target=3/>
   </edges>
 </graph>

Теперь я хочу изменить идентификатор узла, используя generate-id (), но это должно измениться и во всех ребрах. Например, я изменяю идентификатор узла 1 на «1a1», поэтому он должен изменить источник ребра на «1a1» везде в XML. Это должно быть сделано для всех узлов и ребер. Оставшийся xml должен быть таким, какой он есть.

Мой xsl

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

<xsl:template match="@id[parent::node]">
  <xsl:attribute name="id">
  <xsl:value-of select="generate-id()"/>
    </xsl:attribute>
</xsl:template>

это меняет идентификатор узла, но я хочу сравнить источник и цель ребер, а также изменить их. Источник края и цель - это некоторые узлы с идентификатором.

Любая помощь будет принята с благодарностью. Спасибо

Ответы [ 2 ]

1 голос
/ 29 марта 2011

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="kElementById" match="*[@id]" use="@id"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="@id">
        <xsl:attribute name="id">
            <xsl:value-of select="generate-id(..)"/>
        </xsl:attribute>
    </xsl:template>
    <xsl:template match="@source|@target">
        <xsl:attribute name="{name()}">
            <xsl:value-of select="generate-id(key('kElementById',.))"/>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

С этим правильно сформированным вводом:

<graph id="1">
    <nodes>
        <node id ="2">
            <name value="node1"/>
        </node>
        <node id ="3">
            <name value="node3"/>
        </node>
        <edges>
            <edge id="11" source="2" target="3"/>
        </edges>
    </nodes>
</graph>

Вывод:

<graph id="IDAEQBBB">
    <nodes>
        <node id="IDAHQBBB">
            <name value="node1"></name>
        </node>
        <node id="IDALQBBB">
            <name value="node3"></name>
        </node>
        <edges>
            <edge id="IDAQQBBB" source="IDAHQBBB" target="IDALQBBB"></edge>
        </edges>
    </nodes>
</graph>
0 голосов
/ 29 марта 2011

Добавьте этот раздел в XSL, который у вас уже есть.

<xsl:template match="@source[parent::edge]|@target[parent::edge]">
    <xsl:attribute name="{name()}">
        <xsl:value-of select="generate-id(//node[@id=current()]/@id)"/>
    </xsl:attribute>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...