首页 > 解决方案 > 如何在转换 xsllt 期间获取额外的参数

问题描述

下面我将输出日期粘贴到我们的原始 XML 文件中:

<?xml version="1.0" encoding="UTF-8"?>
<products>
    <product>
        <reference><![CDATA[DZT1000]]></reference>
        <attributes><![CDATA[Wodoodpornosc: 3 ATM - Srednica: 62 mm - Rodzaj: Meskie - Material: Stal nierdzewna - Material paska: Skora - Mechanizm: Kwarcowy - Funkcje: Wielofunkcyjnosc - Szkielko: Mineralne - Rodzaj produktu: Zegarek na reke - Opakowanie: Oficjalne pudelko]]></attributes>
    </product>
    <product>
        <reference><![CDATA[DZT10002]]></reference>
        <attributes><![CDATA[Wodoodpornosc: 3 ATM - Srednica: 62 mm - Rodzaj: Meskie - Material: Stal nierdzewna - Material paska: Skora - Mechanizm: Kwarcowy - Funkcje: Wielofunkcyjnosc - Szkielko: Mineralne - Rodzaj produktu: Zegarek na reke - Opakowanie: Oficjalne pudelko]]></attributes>
    </product>
</products>

我们使用 XSLT 1.0 模板,下面是现成的代码:

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

<xsl:template match="/products">
    <products>
        <xsl:for-each select="product">
            <product>
                <xsl:call-template name="tokenize">
                    <xsl:with-param name="text" select="normalize-space(attributes)"/>
                </xsl:call-template>
            </product>
        </xsl:for-each>
    </products>
</xsl:template>

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="delimiter" select="' - '"/>
        <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" />
        <xsl:if test="$token">
            <xsl:element name="{translate(substring-before($token, ': '), ' ', '_')}">
                <xsl:value-of select="substring-after($token, ': ')" />
            </xsl:element>
        </xsl:if>
        <xsl:if test="contains($text, $delimiter)">
            <!-- recursive call -->
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
            </xsl:call-template>
        </xsl:if>
</xsl:template>

</xsl:stylesheet>

目前我从上面得到结果:

<products>
   <product>
      <Wodoodpornosc>3 ATM</Wodoodpornosc>
      <Srednica>62 mm</Srednica>
      <Rodzaj>Meskie</Rodzaj>
      <Material>Stal nierdzewna</Material>
      <Material_paska>Skora</Material_paska>
      <Mechanizm>Kwarcowy</Mechanizm>
      <Funkcje>Wielofunkcyjnosc</Funkcje>
      <Szkielko>Mineralne</Szkielko>
      <Rodzaj_produktu>Zegarek na reke</Rodzaj_produktu>
      <Opakowanie>Oficjalne pudelko</Opakowanie>
   </product>
   <product>
      <Wodoodpornosc>3 ATM</Wodoodpornosc>
      <Srednica>62 mm</Srednica>
      <Rodzaj>Meskie</Rodzaj>
      <Material>Stal nierdzewna</Material>
      <Material_paska>Skora</Material_paska>
      <Mechanizm>Kwarcowy</Mechanizm>
      <Funkcje>Wielofunkcyjnosc</Funkcje>
      <Szkielko>Mineralne</Szkielko>
      <Rodzaj_produktu>Zegarek na reke</Rodzaj_produktu>
      <Opakowanie>Oficjalne pudelko</Opakowanie>
   </product>
</products>

输出日期包含额外属性:<reference><![CDATA[DZT1000]]></reference>

如何在 XSLT 中获取此属性?

我尝试使用值选择等,但不幸的是我无法以任何方式获得此属性。请注意,原始文件包含许多其他属性,但我们只想下载对此的补充,<reference>有人可以帮助我们吗?

标签: xmlxslt

解决方案


IIUC,你只需要做:

<xsl:template match="/products">
    <products>
        <xsl:for-each select="product">
            <product>
                <xsl:copy-of select="reference"/>
                <xsl:call-template name="tokenize">
                    <xsl:with-param name="text" select="normalize-space(attributes)"/>
                </xsl:call-template>
            </product>
        </xsl:for-each>
    </products>
</xsl:template>

请注意,reference输入 XML 是一个元素,不是参数也不是属性


推荐阅读