【问题标题】:XML with XSLT multiple tags带有 XSLT 多个标签的 XML
【发布时间】:2023-03-21 17:25:01
【问题描述】:

我想将 file.xml 解释为 file.txt,这不是问题,但是当我尝试在不同的标签中“获取”许多东西时。

请看一下我的 file.xml:

<racine>
        <balise1>
                 <info>
                      <Commercial>1000</Commercial>
                      <OrdId>42</OrdId>
                      <CustomerId>314159</CustomerId>
                 </info>
        </balise1>
        <balise2>
                 <info2>
                       <Quantity>1</Quantity>
                       <Price>10.0</Price>
                       <Currency>CHF</Currency>
                 </info2>
        </balise2>
</racine>

我想要这个输出;

Commercial,Order,CustomerId,Quantity,Price,Currency
1000,42,314159,1,10.0,CHF

我尝试了很多解决方案,但我是 XSLT 的菜鸟。

这是我的 xslt 示例:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSl/Transform">
<xsl:output method="text" />

<xsl:template match="/">
<xsl:text>Commercial,OrdId,CustomerId,Quantity,Price,Currency</xsl:text>
<xsl:text>&#xa;</xsl:text>
<xsl:apply-templates select="racine"/>     
</xsl:template>

<xsl:template match="racine">
<xsl:apply-templates select="balise1/info"/>
</xsl:template>

<xsl:template match="info">
  <xsl:value-of select="Commercial"/>
  <xsl:text>,</xsl:text>
  <xsl:value-of select="OrdId"/>
  <xsl:text>,</xsl:text>
  <xsl:value-of select="CustomerId"/>
  <xsl:text>&#xa;</xsl:text>
</xsl:template>

<xsl:template match="info">
  <xsl:apply-templates select="balise2/info2"/>
</xsl:template>

<xsl:template match="info2">
<xsl:value-of select="ItemQuantity"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="PriceValue"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="CurrencyCode"/>
<xsl:text>&#xa;</xsl:text>
</xsl:template>

</xsl:stylesheet>

【问题讨论】:

标签: xml csv xslt


【解决方案1】:

您有两个匹配 "info" 的模板,这在 XSLT 中被视为错误。从您需要的内容来看,第二个模板的主体可能应该从匹配racine的模板中调用

<xsl:template match="racine">
  <xsl:apply-templates select="balise1/info"/>
  <xsl:apply-templates select="balise2/info2"/>
</xsl:template>

其他注意事项

  1. 命名空间区分大小写。您已将 xsl 命名空间指定为 http://www.w3.org/1999/XSl/Transform,而它应该是 http://www.w3.org/1999/XSL/Transform
  2. 您的 info2 模板引用了 XML 中不存在的元素。

试试这个 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />

<xsl:template match="/">
  <xsl:text>Commercial,OrdId,CustomerId,Quantity,Price,Currency</xsl:text>
  <xsl:text>&#xa;</xsl:text>
  <xsl:apply-templates select="racine"/>     
</xsl:template>

<xsl:template match="racine">
  <xsl:apply-templates select="balise1/info"/>
  <xsl:apply-templates select="balise2/info2"/>
  <xsl:text>&#xa;</xsl:text>
</xsl:template>

<xsl:template match="info">
  <xsl:value-of select="Commercial"/>
  <xsl:text>,</xsl:text>
  <xsl:value-of select="OrdId"/>
  <xsl:text>,</xsl:text>
  <xsl:value-of select="CustomerId"/>
</xsl:template>

<xsl:template match="info2">
  <xsl:text>,</xsl:text>
  <xsl:value-of select="Quantity"/>
  <xsl:text>,</xsl:text>
  <xsl:value-of select="Price"/>
  <xsl:text>,</xsl:text>
  <xsl:value-of select="Currency"/>
</xsl:template>

</xsl:stylesheet>

【讨论】:

    【解决方案2】:

    如果您的输入具有固定格式,那么您可以在 XSLT 2.0

    中轻松处理此问题
    <xsl:template match="/">
        <xsl:text>Commercial,OrdId,CustomerId,Quantity,Price,Currency</xsl:text>
        <xsl:text>&#xa;</xsl:text>
        <xsl:apply-templates/>
    </xsl:template>
    
    <xsl:template match="racine">
        <xsl:value-of select="balise1/info/*|balise2/info2/*" separator=","/>
        <xsl:text>&#xa;</xsl:text>
    </xsl:template>
    

    【讨论】:

    • 不能使用 XSLT2.0 必须是 1.0
    【解决方案3】:
    Check this code
    
    <xsl:template match="/">
    <xsl:text>Commercial,OrdId,CustomerId,Quantity,Price,Currency</xsl:text>
    <xsl:text>&#xa;</xsl:text>
    <xsl:apply-templates select="racine"/>     
    </xsl:template>
    
    <xsl:template match="info">
    <xsl:value-of select="Commercial"/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select="OrdId"/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select="CustomerId"/>
    </xsl:template>
    
    <xsl:template match="info2">
    <xsl:value-of select="Quantity"/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select="Price"/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select="Currency"/>
    <xsl:text>&#xa;</xsl:text>
    </xsl:template>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2011-02-20
      • 2017-02-17
      相关资源
      最近更新 更多