我有以下xml
<Results>
<form-type>orderform-B</form-type>
<data>
<form-data>
<field>
<name>productid-1</name>
<value>Yes</value>
</field>
<field>
<name>productid-1-qty</name>
<value>2</value>
</field>
<field>
<name>productid-3</name>
<value>Yes</value>
</field>
<field>
<name>productid-4</name>
<value>Yes</value>
</field>
<field>
<name>productid-4-qty</name>
<value>2</value>
</field>
<field>
<name>product-type</name>
<value>productid-5-xl</value>
</field>
<field>
<name>someother-field</name>
<value>xyz</value>
</field>
</form-data>
</data>
</Results>
和下面的XSLT来计算order total:
<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:variable name="pricelist">
<item id="productid-1">5</item>
<item id="productid-2">5</item>
<item id="productid-3">5</item>
<item id="productid-4">5</item>
<item id="productid-5-sm">5</item>
<item id="productid-5-md">10</item>
<item id="productid-5-xl">15</item>
</xsl:variable>
<xsl:key name="price" match="item" use="@id" />
<xsl:key name="qty" match="field" use="name" />
<xsl:template match="/Results">
<total>
<xsl:variable name="charges">
<xsl:apply-templates select="data/form-data/field[starts-with(name, 'productid-') or starts-with(value, 'productid-')]"/>
</xsl:variable>
<xsl:value-of select="sum($charges/charge)" />
</total>
</xsl:template>
<xsl:template match="field">
<xsl:variable name="price" select="key('price', (name, value), $pricelist)" />
<xsl:variable name="qty" select="key('qty', name)" />
<xsl:if test="$price">
<charge>
<xsl:value-of select="$price * (if($qty) then $qty/value else 1)"/>
</charge>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
我想使用一个键获得qty的值,但是我上面所拥有的返回qty字段名和qty值,因为我只想返回值,以便我可以进行计算?
- 我如何获得名称以'-qty'结尾的字段的数量值?
- 我有一些产品,例如订单上的productid-3,其中没有定义的数量值字段,即只列出订购的产品,在这种情况下,订购产品的数量被假定为1。如何重构xslt以适应这一点,使收费的price * qty为price * 1?
*** UPDATE ***
同样在订单中,由于产品类型的变化,订购的产品可以列在value元素中,例如
<field>
<name>product-type</name>
<value>productid-5-xl</value>
</field>
有了定义的键,您当然可以使用$qty/value
(而不是$qty
)来单独选择值。
或者您需要在match="field[...]/value" use="../name"
上声明键,以使key
函数调用返回value
元素。
我会这样做:
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:variable name="pricelist">
<item id="productid-1">5</item>
<item id="productid-2">5</item>
<item id="productid-3">5</item>
<item id="productid-4">5</item>
</xsl:variable>
<xsl:key name="price" match="item" use="@id" />
<xsl:key name="qty" match="field" use="name" />
<xsl:template match="/Results">
<xsl:variable name="charges">
<xsl:apply-templates select="data/form-data/field[value='Yes']"/>
</xsl:variable>
<total>
<xsl:value-of select="sum($charges/charge)" />
</total>
</xsl:template>
<xsl:template match="field">
<xsl:variable name="price" select="key('price', name, $pricelist)" />
<xsl:variable name="qty" select="key('qty', concat(name, '-qty'))" />
<xsl:if test="$price">
<charge>
<xsl:value-of select="$price * (if($qty) then $qty/value else 1)"/>
</charge>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
注:小心不加区分地使用模板;您不希望内置的模板出现,并在结果中添加不需要的文本节点。