xslt - 通过修改现有标记添加新的xml标记

时间:2015-07-30 04:25:19

标签: xml xslt

这是我的xml文件 -

<?xml version="1.0" encoding="UTF-8"?>
<update-all-attributes>
   <document name="http:blah">
      <price>115.00 USD</price>
      <brand_qty>10 A</brand_qty>
      <style_size>10 A_new in stock</style_size>
   </document>
</update-all-attributes>

现在我想要2个新字段 - discounted_price比价格低10%,increase_price比价格高10%,并且还使用XSLT 1.0剥离brand_qty和style_size值之间的额外空格,所以我的xml用xslt修改之后应该看起来像这样 -

<?xml version="1.0" encoding="UTF-8"?>
<update-all-attributes>
   <document name="http:blah">
      <price>115.00 USD</price>
      <discounted_price>103.50 USD</discounted_price>
      <increased_price>126.50 USD</increased_price>
      <brand_qty>10A</brand_qty>
      <style_size>10A_newinstock</style_size>
   </document>
</update-all-attributes>

2 个答案:

答案 0 :(得分:0)

这是一种可能的方式:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="price">
      <xsl:variable name="price" select="number(substring-before(., ' '))"/>
      <xsl:variable name="margin" select="$price*0.1"/>
      <xsl:variable name="currency" select="substring-after(., ' ')"/>
      <xsl:copy>
        <xsl:value-of select="."/>
      </xsl:copy>
      <discounted_price>
        <xsl:value-of select="format-number($price - $margin, '###,###.00')"/>
        <xsl:value-of select="concat(' ', $currency)"/>
      </discounted_price>
      <increased_price>
        <xsl:value-of select="format-number($price + $margin, '###,###.00')"/>
        <xsl:value-of select="concat(' ', $currency)"/>
      </increased_price>
    </xsl:template>

</xsl:stylesheet>

<强> Demo

答案 1 :(得分:0)

首先从identity transform开始。这将按原样复制所有节点。

然后覆盖您需要修改的节点的身份转换;在这种情况下是document元素。

示例...

XML输入

<update-all-attributes>
    <document name="http:blah">
        <price>115.00 USD</price>
    </document>
</update-all-attributes>

XSLT 1.0

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

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

    <xsl:template match="document">
        <xsl:variable name="price" select="substring-before(normalize-space(price),' ')"/>
        <xsl:variable name="currency" select="substring-after(normalize-space(price),' ')"/>
        <xsl:variable name="difference" select="number($price) * .10"/>
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
            <discounted_price><xsl:value-of select="concat(format-number($price - $difference,'#,###.00'),' ',$currency)"/></discounted_price>
            <increased_price><xsl:value-of select="concat(format-number($price + $difference,'#,###.00'),' ',$currency)"/></increased_price>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

XML输出

<update-all-attributes>
   <document name="http:blah">
      <price>115.00 USD</price>
      <discounted_price>103.50 USD</discounted_price>
      <increased_price>126.50 USD</increased_price>
   </document>
</update-all-attributes>