我们有一个需要使用XSLT转换的xml。但是,我们必须添加标记的两个属性并将其放在其他标记中。
在下面的XML编译标记中,“Reusable”列的值为contrib和max_available。我们想要添加这两个属性,并希望它在编译标签的属性postPosition中使用“Usable”列。现在,我们还需要在fac值的基础上添加。
输入
<?xml version="1.0" encoding="UTF-8"?>
<answers user="LST">
<answer name="compile">
<output>
<compilations>
<compilation column="Usable" fac="123" contrib="0" max_available="0" postPosition="35000">
</compilation>
<compilation column="Usable" fac="456" contrib="0" max_available="0" postPosition="35000">
</compilation>
<compilation column="ReUsable" fac="123" contrib="0" max_available="200" postPosition="300">
</compilation>
<compilation column="Reusable" fac="456" contrib="100.00" postPosition="100.00" max_available="200">
</compilation>
</compilations>
</output>
</answer>
</answers>
输出
<?xml version="1.0" encoding="UTF-8"?>
<answers>
<answer name="compile">
<output>
<compilations>
<compilation column="Usable" fac="123" contrib="0" max_available="0" postPosition="500">
</compilation>
<compilation column="Usable" fac="456" contrib="0" max_available="0" postPosition="300">
</compilation>
<compilation column="ReUsable" fac="123" contrib="0" max_available="200" postPosition="300">
</compilation>
<compilation column="Reusable" fac="456" contrib="100.00" postPosition="100.00" max_available="200">
</compilation>
</compilations>
</output>
</answer>
</answers>
答案 0 :(得分:1)
简单地说:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="compilation[@column='Usable']/@postPosition">
<xsl:attribute name="postPosition" select="format-number(../../compilation[@column='Reusable']/(@contrib + @max_available), '0.00')" />
</xsl:template>
</xsl:stylesheet>
请注意,这假设在compilation
元素中只有一个column
具有“可重复使用”compilations
。
在 XSLT 1.0 :
中执行相同的操作<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="compilation[@column='Usable']/@postPosition">
<xsl:variable name="reusable" select="../../compilation[@column='Reusable']" />
<xsl:attribute name="postPosition">
<xsl:value-of select="format-number($reusable/@contrib + $reusable/@max_available, '0.00')" />
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
以下XSLT将复制Usable编译并更改postPosition属性的值:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="compilation[@column='Usable']">
<xsl:copy>
<!-- copy other attributes first -->
<xsl:apply-templates select="@column"/>
<xsl:apply-templates select="@contrib"/>
<xsl:apply-templates select="@max_available"/>
<!-- set the postPosition attribute -->
<xsl:attribute name="postPosition">
<xsl:variable name="reusableCompilation" select="../compilation[@column='Reusable']"/>
<xsl:value-of select="number($reusableCompilation/@contrib)+number($reusableCompilation/@max_available)"></xsl:value-of>
</xsl:attribute>
<!-- copy all child elements -->
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<!-- generic template - copy all the rest -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这将为您提供以下输出,其中包含@contrib + @max_available:
两个属性的总和<?xml version="1.0" encoding="UTF-8"?>
<answers>
<answer name="compile">
<output>
<compilations>
<compilation column="Usable" contrib="0" max_available="0" postPosition="300">
</compilation>
<compilation column="Reusable" contrib="100.00" postPosition="100.00" max_available="200">
</compilation>
</compilations>
</output>
</answer>
</answers>