XSL 在某个字符后显示属性

Posted

技术标签:

【中文标题】XSL 在某个字符后显示属性【英文标题】:XSL Display attribute after a certain character 【发布时间】:2022-01-02 20:47:41 【问题描述】:

我有一个我想显示的属性,但我只想显示它的最后一部分,用“-”表示。我正在使用 substring-after 来执行此操作,但这仅在有一个字符时才有效。在某些情况下可能有一个,而在某些情况下可能有两个。我已经看到了一些用于此的递归模板,但我没有在 For-each 循环中看到它们,就像我在这里看到的那样,我不确定将所有内容放在我的 XSL 文档中的什么位置。

这是我的 XML 文档:

<?xml version="1.0" encoding="UTF-8"?>
<JobList>
<Job T.number="28" />
<Job T.identifier="10mm Drill" />
<Job oper.jobName="2: T28-Contour Milling - Grind me back" />                
<Job T.number="3" />                                
<Job T.identifier="9mm Drill" />                  
<Job oper.jobName="3: T3 Contour Milling" />
</JobList>

这是我的 XSL 文档。我正在使用 XSL 1.0。我正在寻找的结果是我希望它显示为“10mm Drill - Grind me back”而不是“10mm Drill-Contour Milling - Grind me back”,这是我现在使用 substring-after 函数或其他东西得到的同样的结果。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output doctype-public="-//W3C//DTD Xhtml 1.0 Transitional//EN" encoding="UTF-8" method="xml" />
<xsl:param name="REPORT">joblist</xsl:param>
<xsl:param name="LOCALE">en-GB</xsl:param>
<xsl:param name="FORMAT">html</xsl:param>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>Tool Report</title>
</head>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="JobList">
<div style="font-size:;">
<table  style="margin-bottom:50px;font:bold 10px arial;">
<thead>
<tr>
<th style="text-align:center;font-family:Arial;font-size:13;font:bold 7px arial;">
<xsl:value-of select="@month">
</xsl:value-of>
<span>.</span>
<xsl:value-of select="@day">
</xsl:value-of>
<span>.</span>
<xsl:value-of select="@year">
</xsl:value-of>
</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center;font:normal 7px arial;font-size:12px;">
<xsl:value-of select="//Job[position()=1]/@cfg.JOBLISTNAME" />
<span>
</span>
<span>
</span>
</td>
</tr>
</tbody>
<table  border="1" style="margin-bottom:50px;font:13px arial;">
<thead style="font:19;">
<tr style="font-size:19;">
<td style="text-align:center;font-weight:bold;font-size:19;">
          </td>
          <td style="text-align:center;font-weight:bold;font-size:19;">
          </td>
          <td style="text-align:center;font-weight:bold;font-size:19;">
          </td>
          <td style="text-align:center;font-weight:bold;font-size:19;">
          </td>
          <td style="text-align:center;font-weight:bold;font-size:19;">
          </td>
          <td style="text-align:center;font-weight:bold;font-size:19;">
          </td>
          <td style="text-align:center;font-weight:bold;font-size:19;">
          </td>
          <td style="text-align:center;font-weight:bold;font-size:19;">
          </td>
          <td style="text-align:center;font-weight:bold;font-size:19;">
          </td>
        </tr>
      </thead>
      <tbody style="font-size:19;">
        <xsl:for-each select="//Job[not(@T.number=preceding::Job/@T.number)]">
          <tr style="font-size:19;">
            <td style="font-size:19;">
              <xsl:value-of select="@T.number" />
            </td>
            <td>
            </td>
            <td style="font-size:19;">
              <xsl:value-of select="@T.identifier" />
              <xsl:choose>
                <xsl:when test="contains(@T.toolComment3, 'GRIND') or contains(@T.toolComment3, 'Grind')">
                  <xsl:value-of select="@T.toolComment3" />
                </xsl:when>
              </xsl:choose>
              <xsl:choose>
                <xsl:when test="contains(@T.comment2, 'GRIND') or contains(@T.comment2, 'Grind')">
                  <xsl:value-of select="@T.comment2" />
                </xsl:when>
              </xsl:choose>
              <xsl:choose>
                <xsl:when test="contains(@oper.jobName, 'GRIND') or contains(@oper.jobName, 'Grind')">
                  <xsl:value-of select="substring-after(@oper.jobName, '-')" />
                </xsl:when>
              </xsl:choose>
            </td>
          </tr>
        </xsl:for-each>
      </tbody>
    </table>
  </table>
</div>
</xsl:template>
</xsl:stylesheet>

【问题讨论】:

您将使用哪种 XSLT 1.0 处理器? 微软 MSXML 【参考方案1】:

使用命名递归模板获取文本字符串的最后一个标记。

<xsl:template name="last-token">
    <xsl:param name="text"/>
    <xsl:param name="delimiter" select="'-'"/>
    <xsl:choose>
        <xsl:when test="contains($text, $delimiter)">
            <!-- recursive call -->
            <xsl:call-template name="last-token">
                <xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$text"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

调用示例:http://xsltransform.net/bFWR5Ew

【讨论】:

如何在我的 xsl 中输入这个? 我不太清楚,因为我没看过(太长了)。但基本上,不要像演示中那样做&lt;xsl:value-of select="substring-after(@oper.jobName, '-')" /&gt;xsl:call-template,而是将@oper.jobName 作为text 参数。 这是我在研究带有 substring-after 的递归模板时看到的,但我一直试图在我的代码中输入它,但我无法让它正常工作。 我不确定将调用模板函数放在哪里。我尝试了几个地方,但都不起作用。

以上是关于XSL 在某个字符后显示属性的主要内容,如果未能解决你的问题,请参考以下文章

如果祖先的属性使用 xsl 持有某个值,我如何删除属性和元素

JavaScript XMLDOM XML XSL Internet Explorer - 我无法在浏览器中显示转换后的文件

XSL 中的特殊字符

使用XSL显示内部XML相当印刷

如何在xsl中添加jquery函数(Date)

为啥 XSL 样式表显示没有 XML(信息/值)的 html 表