XSLT需要帮助转换XML以显示值和属性

时间:2016-11-15 11:45:00

标签: xml xslt transformation

我在这里的第一篇文章,但在这里,

我有一个从我们的扫描系统输出的XML文档,如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<DOCUMENT>  
<DOCUMENTINDEX Name="Company">LR</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="Contract Code">L1935</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="Entry Date">2016-11-14</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="Order Account">04060</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="Order Raised By">Jonathan Banks</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="Order Total">358</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="Purchase Order Date">2016-11-14</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="Purchase Order ID">PC022987-1</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="Supplier Code">04060</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="Supplier Name">Dynahurst Limited</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="VAT">71.6</DOCUMENTINDEX>
</DOCUMENT>>

我需要它看起来如下,

<COMPANY>LR</COMPANY>
<CONTRACT CODE>L1935</CONTRACT CODE> 

ETC等......

我正在尝试使用XSLT对此进行排序,并且到目前为止已经设法拔出了Name部分,但我无法获得该值。

到目前为止我的脚本看起来像......

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
        <xsl:apply-templates select="//DOCUMENTINDEX"/>
</xsl:template>

<xsl:template match="DOCUMENTINDEX">
    <br/><xsl:value-of select="@Name"/>
</xsl:template>

有没有人知道如何将此转换作为模板进行转换,以便我可以将其输入扫描软件,以便在扫描到系统时将文档输出转换。

这给了我以下输出。

Company
Contract Code
Entry Date
Order Account
Order Raised By
Order Total
Purchase Order Date
Purchase Order ID
Supplier Code
Supplier Name
VAT

由于

克里斯

2 个答案:

答案 0 :(得分:1)

以下是一种可能的解决方案:

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

    <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz '" />
    <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'" />

    <xsl:template match="/*">
        <xsl:for-each select="DOCUMENTINDEX">
            <xsl:variable name="name" select="@Name" />
            <xsl:element name="{translate($name, $smallcase, $uppercase)}"><xsl:value-of select="text()"/></xsl:element>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

请注意,元素名称中不能包含空格。因此,在转换过程中,我用下划线_

替换它们

答案 1 :(得分:0)

Helo!

您可以使用以下内容获取当前处理元素的值:

<xsl:value-of select="."/>

XML元素名称对空格无效,因此您可以使用以下命令删除它们:

translate(./@Name,' ','')

您可以使用构造函数创建XML元素,并在其中提供其名称:

<xsl:element name="{translate(./@Name,' ','')}"/>

最终代码如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:apply-templates select="//DOCUMENTINDEX"/>
    </xsl:template>
    <xsl:template match="DOCUMENTINDEX">
        <xsl:element name="{translate(./@Name,' ','')}">
            <xsl:value-of select="."/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>