XML / XSLT: как добавить атрибут к элементу - PullRequest
0 голосов
/ 18 октября 2019

Мне нужен толчок в правильном направлении при использовании XSLT для преобразования XML в XML.

Это мой исходный XML:

<Master>
 <Camera CamID="007" Name="Cammie">
      <CameraUptime Uptime="20"/>
      <Detection Total="400">
        <Phase phase1="40" phase2="0" phase3="160">XYZ</Phase>
        <Phase phase1="180" phase2="20" phase3="0">XYZ</Phase>
      </Detection>
  </Camera>
  <Camera CamID="099" Name="Saturn">
      <CameraUptime Uptime="20"/>
      <Detection Total="4000">
        <Phase phase1="400" phase2="0" phase3="1600">XYZ</Phase>
      </Detection>
  </Camera>
</Master>

Используя XSL, я смог добавить 'ParentNode 'к элементу, см. XSL:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="no" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

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

Вывод:

<?xml version="1.0" encoding="utf-8"?>
<Master>
  <Camera CamID="007" Name="Cammie">
    <CameraUptime Uptime="20" />
    <Detection Total="400">
      <ParentNode>
        <Phase phase1="40" phase2="0" phase3="160">XYZ</Phase>
      </ParentNode>
      <ParentNode>
        <Phase phase1="180" phase2="20" phase3="0">XYZ</Phase>
      </ParentNode>
    </Detection>
  </Camera>
  <Camera CamID="099" Name="Saturn">
    <CameraUptime Uptime="20" />
    <Detection Total="4000">
      <ParentNode>
        <Phase phase1="400" phase2="0" phase3="1600">XYZ</Phase>
      </ParentNode>
    </Detection>
  </Camera>
</Master>

Теперь мне нужно добавить правильный CamID к элементу' Phase '. Вывод должен выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<Master>
  <Camera CamID="007" Name="Cammie">
    <CameraUptime Uptime="20" />
    <Detection Total="400">
      <ParentNode>
        <Phase phase1="40" phase2="0" phase3="160" CamID="007">XYZ</Phase>
      </ParentNode>
      <ParentNode>
        <Phase phase1="180" phase2="20" phase3="0" CamID="007">XYZ</Phase>
      </ParentNode>
    </Detection>
  </Camera>
  <Camera CamID="099" Name="Saturn">
    <CameraUptime Uptime="20" />
    <Detection Total="4000">
      <ParentNode>
        <Phase phase1="400" phase2="0" phase3="1600" CamID="099">XYZ</Phase>
      </ParentNode>
    </Detection>
  </Camera>
</Master>

Любые советы о том, как поступить, приветствуются:)

1 Ответ

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

Вы можете просто изменить:

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

в шаблоне, соответствующем Phase на:

<xsl:apply-templates select="@*|node()|ancestor::Camera/@CamID"" />
...