xml - 如何在转换 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>
有人可以帮助我们吗?
解决方案
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 是一个元素,不是参数也不是属性。
推荐阅读
- node.js - 如何在 Express/node js 中发送错误响应?
- mysql - Docker - 使用 sequel pro 连接到 mysql
- android - 使用 Glide 从 filesDir() 加载九个补丁
- java - 如何减少使用 mapStruct 映射 Java bean 的时间
- c++ - 字符串问题,错误:没有构造函数实例与参数列表匹配
- python - 无法通过 xcom push 获取返回值
- angular - ag-grid加载后如何禁用按钮
- javascript - 如何使用 li-name 作为 li-item 中的链接
- php - 如何仅显示用户表中排名列中值为1的用户?
- python - 如何将bash转换为python3?