XML/XSLT: 如何给元素添加属性
XML/XSLT: How to add attribute to element
我需要在正确的方向上推动使用 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>
非常感谢有关如何进行的任何提示:)
您可以简单地更改:
<xsl:apply-templates select="@*|node()" />
在模板中将 Phase
匹配到:
<xsl:apply-templates select="@*|node()|ancestor::Camera/@CamID"" />
我需要在正确的方向上推动使用 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>
非常感谢有关如何进行的任何提示:)
您可以简单地更改:
<xsl:apply-templates select="@*|node()" />
在模板中将 Phase
匹配到:
<xsl:apply-templates select="@*|node()|ancestor::Camera/@CamID"" />