需要XSLT将具有不同属性值的xml转换为具有CDATA的xml

时间:2018-10-24 15:04:30

标签: xml xslt

我需要一个xslt转换,该转换将转换一次应用生成的xml并发送到另一个要处理的应用程序。以下是一个示例源xml,其中包含数据字段名称及其相关数据,例如'current_date','item'..用于字段名称,以及'18 -OCT-2018','1044103'..用于数据值。

    <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
    <labels _JOBNAME="LBL1273711">
      <label>
        <variable name= "current_date">18-OCT-2018</variable>
        <variable name= "item">1044103</variable>
        <variable name= "item_description">RING,22-16 AWG,#4,RED,PB FREE</variable>
        <variable name= "locator">INRE</variable>
      </label>
    </labels>

上面的xml转换为下面的xml:

    <XMLScript Version="1.0">
    <Command>
        <Print JobName="LBL1273711">
            <RecordSet Name="Text File 1" Type="btTextFile" AddIfNone="true">
            <TextData><![CDATA[
    current_date", "item", "item_description", "locator"
    "18-OCT-2018", "1044103", "RING,22-16 AWG,#4,RED,PB FREE", "INRE"
                ]]></TextData>
            </RecordSet>
        </Print>
    </Command>
</XMLScript>

数据字段名称,字段计数及其值会有所不同,并且从一个传入的xml更改为另一个。我在一个要求中使用下面的xslt,其中字段名称和字段计数是硬编码的。但是我需要对其进行更改,以转换变量/名称中提供的任意数量的字段计数和字段名称的源xml。

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" cdata-section-elements="TextData"/>
<xsl:template match="/labels">
<XMLScript Version="1.0">
    <Command>
        <Print JobName="{@_JOBNAME}">
            <RecordSet Name="Text File 1" Type="btTextFile" AddIfNone="true">
                <TextData>
                    <xsl:value-of select="concat('&#xa;'
                        ,'current_date','&quot;, &quot;','item','&quot;, &quot;',
                        'item_description','&quot;, &quot;','locator','&quot;&#xa;')" />
                    <xsl:for-each select="label">
                        <xsl:value-of select="concat('&quot;',
                        variable[@name='current_date'],'&quot;, &quot;',
                        variable[@name='item'],'&quot;, &quot;',
                        variable[@name='item_description'],'&quot;, &quot;',
                        variable[@name='locator'],'&quot;&#xa;'
                        )" />
            </xsl:for-each>
                    </TextData>
                </RecordSet>
        </Print>
    </Command>
    </XMLScript>
    </xsl:template>
</xsl:stylesheet>

谢谢。

1 个答案:

答案 0 :(得分:1)

如果您可以假设,对于给定的XML,每个access下都有相同的label元素,则可以执行此操作以输出标头。...

variable

同样,对于每个标签,执行此操作以输出值

<xsl:for-each select="label[1]/variable">
   <xsl:if test="position() > 1">,</xsl:if>
  <xsl:value-of select="concat('&quot;', @name, '&quot;')" />
</xsl:for-each>

尝试使用此XSLT

<xsl:for-each select="variable">
  <xsl:if test="position() > 1">,</xsl:if>
  <xsl:value-of select="concat('&quot;', ., '&quot;')" />
</xsl:for-each>

请注意,如果您可以使用XSLT 2.0,则可以将<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" cdata-section-elements="TextData"/> <xsl:template match="/labels"> <XMLScript Version="1.0"> <Command> <Print JobName="{@_JOBNAME}"> <RecordSet Name="Text File 1" Type="btTextFile" AddIfNone="true"> <TextData> <xsl:for-each select="label[1]/variable"> <xsl:if test="position() > 1">,</xsl:if> <xsl:value-of select="concat('&quot;', @name, '&quot;')" /> </xsl:for-each> <xsl:text>&#10;</xsl:text> <xsl:for-each select="label"> <xsl:for-each select="variable"> <xsl:if test="position() > 1">,</xsl:if> <xsl:value-of select="concat('&quot;', ., '&quot;')" /> </xsl:for-each> <xsl:text>&#10;</xsl:text> </xsl:for-each> </TextData> </RecordSet> </Print> </Command> </XMLScript> </xsl:template> </xsl:stylesheet> 替换为更简单的xsl:for-each语句...

xsl:value-of