如何使用 XSLT 生成可选的类属性值

Posted

技术标签:

【中文标题】如何使用 XSLT 生成可选的类属性值【英文标题】:How to make optionally generated class attribute value using XSLT 【发布时间】:2021-01-18 09:32:09 【问题描述】:

我将使用 XSLT,但我不知道如何生成动态附加的类名。和class="has-title column-4" 一样,我想创建以空格分隔的经典类值。

// Original XML string..
<contents>
    <box type="list" mark="kr-con">
        <li>test texts..</li>
        <li>test texts..</li>
        ..
        <li>test texts..</li>
    </box>
</contents>

XSLTProcessing 之后..我想得到,

<div class="box box-list column-1">
    <li>test texts..</li>
    <li>test texts..</li>
    .. (processed elements)
    <li>test texts..</li>
</div>

在原始 xml 中,box[@type] 具有默认值 list,因此原始 xml 字符串虽然结果具有 box-list 类,但没有此属性。 此外,box[@column] 属性不存在,但具有默认值 1 并导致 column-1 类。

..

类似的东西..

我已经尝试了这么多小时,但我认为我无法处理这个.. XSL 的事情。非常沮丧..但仍然需要..

如何生成类值?

我尝试使用&lt;xsl:variable&gt; 标签创建一些变量,但它出错的次数越来越多..


在查看答案并尝试后..我得到了以下..

<!-- figure 처리 -->
<xsl:template match="figure">
    <!-- align 속성 처리 -->
    <xsl:variable name="align">
        <xsl:choose>
            <xsl:when test="not(@align) and parent::p and position()=1">
                <xsl:value-of select="'right'"/>
            </xsl:when>
            <xsl:when test="not(@align)">
                <xsl:value-of select="'center'"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="@align"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <!-- width 처리 -->
    <xsl:variable name="width">
        <xsl:choose>
            <xsl:when test="not(@width)">
                <xsl:value-of select="'width-6'"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="@width"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <!-- 주 요소 처리 -->
    <xsl:choose>
        <xsl:when test="parent::li">
            <img src="@url" class="width-12"/>
        </xsl:when>
        <xsl:otherwise>
            <img src="@url" class="align-@align @width"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

哈哈~

【问题讨论】:

【参考方案1】:

我不确定我是否真的明白你想要做什么,但这应该给你一个开始的例子。

在 XSLT 1.0 中

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

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="contents/box">
    <xsl:variable name="box">
        <xsl:choose>
            <xsl:when test="@type='list'">
                <xsl:value-of select="'box-list'"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="@type"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:variable name="col">
        <xsl:choose>
            <xsl:when test="@column">
                <xsl:value-of select="@column"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="'1'"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    
    <div class="concat('box',' ',$box,' ','column-',$col)">
        <xsl:copy-of select="li"/>
    </div>
  </xsl:template>
  
</xsl:stylesheet>

在这里查看它的工作原理:https://xsltfiddle.liberty-development.net/3MEcZxw

【讨论】:

谢谢,我记得你。我相信你在这个社区教过我很多次。非常感谢您的所有努力。我用你的提示解决了这个问题。

以上是关于如何使用 XSLT 生成可选的类属性值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 xslt 获取 XML 的属性值和代码作为 html 的值

如何展平可选的异构值数组

有没有办法将默认值设置为缺少/可选的 JSON 属性?

如何避免在 Webpack 2 的配置中使用可选的解析选项?

.Net SvcUtil:属性必须是可选的

如何将值设置为可选的 QueryParam 以在 java 中调用 rest api