【问题标题】:XML element name has empty space, how to address it in XSLT?XML 元素名称有空格,如何在 XSLT 中解决?
【发布时间】:2021-03-30 05:30:43
【问题描述】:

我几天前开始学习 Linux,目前我被 XSLT 困住了。对不起,如果这是一个愚蠢的问题或已经在其他地方回答过,我在这里很新。

我的 XML 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<lac xmlns:t="http://smth.de">
    <header>
        <order id="20210323346730329408"/>
        <adress id="IZ0009"/>
    </header>
        <items>
            <item id="1"><material><code>IS-0001-BT-1</code><lotcode/></material><qty>10,000000</qty><expiry/></item>
            <item id="2"><material><code>IS-0001-BT-2</code><lotcode/></material><qty>20,000000</qty><expiry/></item>
            <item id="3"><material><code>IS-0001-AZ-1</code><lotcode/></material><qty>30,000000</qty><expiry/></item>
            <item id="4"><material><code>IS-0001-AZ-2</code><lotcode/></material><qty>40,000000</qty><expiry/></item>
        </items>
</lac>

我想得到这个输出:

Order ID,Adress ID,Item ID,MaterialCode,MaterialLotCode,MaterialQty,Expiry
20210323346730329408,IZ0009,1,IS-0001-BT-1,,10,000000,
20210323346730329408,IZ0009,2,IS-0001-BT-2,,20,000000,
20210323346730329408,IZ0009,3,IS-0001-AZ-1,,30,000000,
20210323346730329408,IZ0009,4,IS-0001-AZ-2,,40,000000,

这是我到目前为止所得到的,非常欢迎您的帮助:

<?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" encoding="UTF-8"/>
<xsl:strip-space elements="*" />

<xsl:template match="/">
<xsl:text>Order ID,Adress ID,Item ID,MaterialCode,MaterialLotCode,MaterialQty,Expiry&#x0A;</xsl:text> 
<xsl:apply-templates mode="runHeader"/>
 <xsl:apply-templates mode="runItems"/>
</xsl:template>

<xsl:template match="header" mode="runHeader">
 <xsl:apply-templates mode="runOrder"/>
 <xsl:apply-templates mode="runAdress"/>
</xsl:template>

<xsl:template match="order" mode="runOrder">
<xsl:value-of select="./@id"/>
<xsl:text>,</xsl:text>
</xsl:template>

<xsl:template match="adress" mode="runAdress">
<xsl:value-of select="./@id"/>
<xsl:text>,</xsl:text>
</xsl:template>

<xsl:template match="items" mode="runItems">
    <xsl:for-each select="//item">
    <xsl:value-of select="./@id"/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select="./material"/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select="./lotcode"/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select="./qty"/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select="./expiry"/>
    <xsl:text>&#x0A;</xsl:text>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

非常感谢。

【问题讨论】:

  • 提示 1:您的所有 XML 元素和属性实际上都不在命名空间中。 (您的 XML 定义了一个命名空间前缀 t,但没有在任何地方使用它。)所以直接匹配元素名称,而不是通过 *[contains(name(), 'adress')] shenanigan。
  • 提示 2:order id 不是包含空格的元素名称。元素名称是order,它有一个名为id属性
  • 提示 3:您的 XML 中没有 run2 元素,因此尝试匹配它的模板永远不会匹配任何东西。
  • 感谢您的提示,我会确保遵循它们。正如我所说,我是一个全新的人,所以除了我目前的、有缺陷的、基于反复试验/过去的方法之外,我很高兴能得到任何帮助。

标签: xslt


【解决方案1】:

我会建议一种不同的方法:

XSLT 1.0

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

<xsl:template match="/lac">
    <!-- header row -->
    <xsl:text>Order ID,Adress ID,Item ID,MaterialCode,MaterialLotCode,MaterialQty,Expiry&#10;</xsl:text> 
    <!-- common data -->
    <xsl:variable name="common">
        <xsl:value-of select="header/order/@id"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="header/adress/@id"/>
        <xsl:text>,</xsl:text>
    </xsl:variable>
    <!-- data rows -->
    <xsl:for-each select="items/item">
        <xsl:copy-of select="$common"/>
        <xsl:value-of select="@id"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="material/code"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="material/lotcode"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="qty"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="expiry"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

请注意,这假定每个 item 最多有一个 material(您的 XML 结构允许更多)。

--
附言address 不是这样拼写的。

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2010-10-09
    • 1970-01-01
    相关资源
    最近更新 更多