数字标签 <images> XSLT / XML

Posted

技术标签:

【中文标题】数字标签 <images> XSLT / XML【英文标题】:Number tags <images> XSLT / XML 【发布时间】:2021-12-15 05:53:35 【问题描述】:

XSLT 2.0 具有用于此类任务的内置函数 tokenize()。

以下是我们用于导入产品图像的输入 XML 代码。

<?xml version="1.0"?>
<data>
    <post>
        <SKU>I-DQ5285 53053</SKU>
        <ImageURL>https://testweb.com/wp-content/uploads/2021/08/DQ5285-53053.jpg|https://testweb.com/wp-content/uploads/2021/08/DQ5285-53053_2.jpg|https://testweb.com/wp-content/uploads/2021/08/DQ5285-53053_3.jpg|https://testweb.com/wp-content/uploads/2021/08/DQ5285-53053_4.jpg</ImageURL>
    </post>
</data>

代码 XSLT 转换

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ImageURL">
        <xsl:call-template name="tokenize">
            <xsl:with-param name="text" select="normalize-space(.)"/>
            <xsl:with-param name="elemName" select="'ImageURL'"/>
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="tokenize">
        <xsl:param name="text"/>
        <xsl:param name="elemName"/>
        <xsl:param name="delimiter" select="'|'"/>
        <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)"/>
        <xsl:if test="$token">
            <xsl:element name="$elemName">
                <xsl:value-of select="$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:with-param name="elemName" select="$elemName"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

输出 XML。现在我将结果粘贴到下面。

<?xml version="1.0" encoding="utf-8"?>
<data>
  <post>
    <SKU>I-DQ5285 53053</SKU>
    <ImageURL>https://testweb.com/wp-content/uploads/2021/08/DQ5285-53053.jpg</ImageURL>
    <ImageURL>https://testweb.com/wp-content/uploads/2021/08/DQ5285-53053_2.jpg</ImageURL>
    <ImageURL>https://testweb.com/wp-content/uploads/2021/08/DQ5285-53053_3.jpg</ImageURL>
    <ImageURL>https://testweb.com/wp-content/uploads/2021/08/DQ5285-53053_4.jpg</ImageURL>
  </post>
</data>

结果除外:

<?xml version="1.0" encoding="utf-8"?>
<data>
  <post>
    <SKU>I-DQ5285 53053</SKU>
    <ImageURL1>https://testweb.com/wp-content/uploads/2021/08/DQ5285-53053.jpg</ImageURL1>
    <ImageURL2>https://testweb.com/wp-content/uploads/2021/08/DQ5285-53053_2.jpg</ImageURL2>
    <ImageURL3>https://testweb.com/wp-content/uploads/2021/08/DQ5285-53053_3.jpg</ImageURL3>
    <ImageURL4>https://testweb.com/wp-content/uploads/2021/08/DQ5285-53053_4.jpg</ImageURL4>
  </post>
</data>

谁能帮我们自动给这个编号?我们将感谢您的帮助。

【问题讨论】:

您使用的是哪个处理器?一些 XSLT 1.0 处理器支持 EXSLT str:tokenize() 扩展功能。 【参考方案1】:

试试:

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="elemName"/>
    <xsl:param name="i" select="1"/>
    <xsl:param name="delimiter" select="'|'"/>
    <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)"/>
    <xsl:if test="$token">
        <xsl:element name="$elemName$i">
            <xsl:value-of select="$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:with-param name="elemName" select="$elemName"/>
            <xsl:with-param name="i" select="$i + 1"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

【讨论】:

有了上面这个我得到问题:prnt.sc/1xv5w8c 第 37 行 php 代码是:$xslDoc = new \DOMDocument(); $xslDoc->loadXML($xsl, LIBXML_COMPACT | LIBXML_PARSEHUGE | LIBXML_NOWARNING); 恐怕我不知道你描述了什么。您可以在此处查看代码:xsltfiddle.liberty-development.net/eieFA2e

以上是关于数字标签 <images> XSLT / XML的主要内容,如果未能解决你的问题,请参考以下文章

如何在</Underline>标签后检查换行符(&#10)并需要替换为xslt代码中的<br/>标签

XSLT 访问和创建嵌套 xml 并将标签转换为属性

通过 XSLT 转换 XML 文件将数字转换为罗马数字

在xslt中的单个标签下解析多个标签的文本

XSLT 如何将常用标签包装在不同的包装元素中?

如何使用 xslt 更改单个标签?