XSLT -获取单个值的关键函数



我有以下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>

注:小心不加区分地使用模板;您不希望内置的模板出现,并在结果中添加不需要的文本节点。

相关内容

  • 没有找到相关文章