Измените значение атрибута, если у элемента есть дополнительный атрибут с определенным идентификатором - PullRequest
0 голосов
/ 23 мая 2019

Сначала я кратко опишу, что я хочу сделать: я работаю с SysMl Modeler для создания диаграммы активности. После того, как я закончил свою модель с помощью SysML Modeler, я могу создать файл XML из моей модели. Этот XML-файл должен быть импортирован в другой инструмент. Однако для лучшего понимания исходного XML-кода я хочу преобразовать его. В следующем XML-коде вы можете увидеть узел 'edge'. Каждый «крайний» узел относится к «цели» и «источнику». Но если вы не сильно разбираетесь в коде, вы не можете прочитать, к какому элементу относятся «источник» и «цель» (вы видите только несколько букв и цифр подряд). Если вы посмотрите дальше, вы поймете, что буквы и строки относятся к «реальным» именам, таким как «machine1». Теперь мой вопрос: как я могу написать код для преобразования, которое переключает, например, 'target = "abcd"' на 'target =' machine2 "'?

У меня есть следующий XML-код:

<uml:Model xmlns:xmi="http://www.omg.org/spec/XMI/20131001"
           xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
           xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML"
           xmi:id="_x3pzQHiSEemHwJRDr6_Icw"
           name="activity_diagram">
   <Entity name="Activity_diagram">
      <edge xmi:id="_51rDcHrnEemHwJRDr6_Icw"
            target="abcd"
            source="1234"/>
      <edge xmi:id="_C81fcHrsEemj44S3Yi86Ww"
            target="wwww"
            source="abcd"/>
      <edge xmi:id="_Dgu2sHrsEemj44S3Yi86Ww"
            target="zuio"
            source="wwww"/>
      <edge xmi:id="_ECWWAHrsEemj44S3Yi86Ww"
            target="yxcv"
            source="zuio"/>
      <node xmi:id="1234" name="machine1"/>
      <node xmi:id="yxcv" name="machine5"/>
      <node xmi:id="abcd" name="machine2"/>
      <node xmi:id="zuio" name="machine4"/>
      <node xmi:id="wwww" name="machine3"/>
   </Entity>
</uml:Model>

Вот мой текущий код, как вы можете видеть, я хотел уменьшить сложность кода, поэтому фактический код немного отличается от того, который вы видите выше

Заранее спасибо!

1 Ответ

1 голос
/ 23 мая 2019

Используйте клавишу для поиска имен узлов - например:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xmi="http://www.omg.org/spec/XMI/20131001">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="node-by-id" match="node" use="@xmi:id" />

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

<xsl:template match="edge">
    <edge xmi:id="{@xmi:id}"
          target="{key('node-by-id', @target)/@name}"
          source="{key('node-by-id', @source)/@name}"/>
</xsl:template>

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