1

我有两个 xslt 转换应用于 xml 消息。首先是删除所有命名空间和前缀。这是代码:

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

 <xsl:template match="@*|node()[not(self::*)]">
  <xsl:copy/>
 </xsl:template>

 <xsl:template match="*">
  <xsl:element name="{local-name()}">
   <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

第二个是从第一个的输出中选择元素:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <onSale><xsl:value-of select="//entry/content/product_product/sale_ok" /></onSale>
        <onlineOnly><xsl:value-of select="//entry/content/product_product/online" /></onlineOnly>
        <name><xsl:value-of select="//entry/content/product_product/name" /></name>
        <isbn><xsl:value-of select="//entry/content/product_product/isbn" /></isbn>
        <price><xsl:value-of select="//entry/content/product_product/price" /></price>
        <active><xsl:value-of select="//entry/content/product_product/active" /></active>
        <format><xsl:value-of select="//entry/content/product_product/format" /></format>
        <collection><xsl:value-of select="//entry/content/product_product/collection" /></collection>
        <dateParution><xsl:value-of select="//entry/content/product_product/date_parution"/></dateParution>
        <ean13><xsl:value-of select="//entry/content/product_product/ean13"/></ean13>
    </xsl:template>
</xsl:stylesheet>

我如何在一个 xslt 转换中应用它们两个而不单独进行两个转换。谢谢

4

1 回答 1

0

我不知道你的环境支持哪个版本的 XSLT,你可以使用 XSLT 2.0

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

<xsl:variable name="step1">
 <xsl:apply-templates mode="step1"/>
</xsl:variable>

 <xsl:template match="@*|node()[not(self::*)]" mode="step1">
  <xsl:copy/>
 </xsl:template>

 <xsl:template match="*" mode="step1">
  <xsl:element name="{local-name()}">
   <xsl:apply-templates select="node()|@*" mode="step1"/>
  </xsl:element>
 </xsl:template>

    <xsl:template match="/">
      <xsl:apply-templates select="$step1//entry"/>
    </xsl:template>

    <xsl:template match="entry">
        <onSale><xsl:value-of select="content/product_product/sale_ok" /></onSale>
        <onlineOnly><xsl:value-of select="content/product_product/online" /></onlineOnly>
        <name><xsl:value-of select="content/product_product/name" /></name>
        <isbn><xsl:value-of select="content/product_product/isbn" /></isbn>
        <price><xsl:value-of select="content/product_product/price" /></price>
        <active><xsl:value-of select="content/product_product/active" /></active>
        <format><xsl:value-of select="content/product_product/format" /></format>
        <collection><xsl:value-of select="content/product_product/collection" /></collection>
        <dateParution><xsl:value-of select="content/product_product/date_parution"/></dateParution>
        <ean13><xsl:value-of select="content/product_product/ean13"/></ean13>
    </xsl:template>

</xsl:stylesheet>

但是,我会进一步重构并编写模板,例如

<xsl:template match="sale_ok">
  <onSale>
    <xsl:value-of select="."/>
  </onSale>
</xsl:template>

如果您使用 XSLT 1.0,您需要一个扩展函数来使用 apply-templates 处理变量的内容,这样做

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

<xsl:variable name="step1">
 <xsl:apply-templates mode="step1"/>
</xsl:variable>

 <xsl:template match="@*|node()[not(self::*)]" mode="step1">
  <xsl:copy/>
 </xsl:template>

 <xsl:template match="*" mode="step1">
  <xsl:element name="{local-name()}">
   <xsl:apply-templates select="node()|@*" mode="step1"/>
  </xsl:element>
 </xsl:template>

    <xsl:template match="/">
      <xsl:apply-templates select="exsl:node-set($step1)//entry"/>
    </xsl:template>

    <xsl:template match="entry">
        <onSale><xsl:value-of select="content/product_product/sale_ok" /></onSale>
        <onlineOnly><xsl:value-of select="content/product_product/online" /></onlineOnly>
        <name><xsl:value-of select="content/product_product/name" /></name>
        <isbn><xsl:value-of select="content/product_product/isbn" /></isbn>
        <price><xsl:value-of select="content/product_product/price" /></price>
        <active><xsl:value-of select="content/product_product/active" /></active>
        <format><xsl:value-of select="content/product_product/format" /></format>
        <collection><xsl:value-of select="content/product_product/collection" /></collection>
        <dateParution><xsl:value-of select="content/product_product/date_parution"/></dateParution>
        <ean13><xsl:value-of select="content/product_product/ean13"/></ean13>
    </xsl:template>

</xsl:stylesheet>

另一方面,我想知道为什么我们最近遇到很多问题,试图消除或忽略名称空间,如果你真的想用 XSLT 2.0 做到这一点,那么做

<xsl:template match="*:sale_ok">
  <onSale>
     <xsl:value-of select="."/>
  <onSale>
</xsl:template>

等等就足够了。

于 2013-06-17T17:46:59.663 回答