java - 如何对 XSLT 中节点的内联元素应用不同的规则?

标签 java xml xslt

我试图在 xslt 的帮助下转换 xml,同时通过读取规则文件在 java 的帮助下生成 xslt。

假设 Xml 是这样的。

<root>
    <p> This is <span>India</span> &amp; is <span>tolerant</span> enough to <span>live</span>normal black here</p>
    <p> Well <span>Pakistan</span> ,<span>Srilanka</span>, <span>Bangladesh</span>,<span>China</span> is our neighbouring country</p>
</root>

我希望第一个 p 的第一个跨度为绿色,第二个跨度未映射,因此为普通黑色,第三个跨度为蓝色。

同样,可以有更多的“否”。内联元素可能会出现并且有不同的规则。

类似地,第二个“p”对于不同的内联元素将有不同的规则。我如何在 xslt 中区分和应用此规则?

Java读取规则文件并动态准备xslt?

有人可以建议如何做到这一点吗?

最佳答案

您可以做的是拥有一系列模板,并在条件匹配中包含各种规则。例如

<xsl:template match="p/span[1]">
  <span style="color:red">
      <xsl:apply-templates select="@*|node()"/>
  </span>
</xsl:template>

<xsl:template match="p/span[2]">
  <span style="color:blue">
      <xsl:apply-templates select="@*|node()"/>
  </span>
</xsl:template>

<xsl:template match="p/span[position() > 2]">
  <span style="color:green">
      <xsl:apply-templates select="@*|node()"/>
  </span>
</xsl:template>

或者,在匹配 span 标记的情况下,您可以将它们全部合并到一个模板中,并使用 xsl:choose 代替。

<xsl:template match="p/span">
    <xsl:variable name="position">
        <xsl:number />
    </xsl:variable>
    <xsl:variable name="colour">
        <xsl:choose>
            <xsl:when test="$position = 1">red</xsl:when>
            <xsl:when test="$position = 2">green</xsl:when>
            <xsl:otherwise>blue</xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
      <span style="color:{$colour}">
          <xsl:apply-templates select="@*|node()"/>
      </span>
</xsl:template>

初学者尝试一下这个 XSLT

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

    <xsl:template match="p/span">
        <xsl:variable name="position">
            <xsl:number />
        </xsl:variable>
        <xsl:variable name="colour">
            <xsl:choose>
                <xsl:when test="$position = 1">red</xsl:when>
                <xsl:when test="$position = 2">green</xsl:when>
                <xsl:otherwise>blue</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
          <span style="color:{$colour}">
              <xsl:apply-templates select="@*|node()"/>
          </span>
    </xsl:template>

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

关于java - 如何对 XSLT 中节点的内联元素应用不同的规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35291311/

相关文章:

xml - 开始和结束标记不匹配 : meta line 4 and head

java - 在 XSLT 中得到错误的输出?

java - CheckStyle 包含的各种 xsl 文件之间有什么区别?

css - 使用 xml 文档处理 css 样式表

java - 使用 Spring 时获取 HttpMessageNotReadableException 异常 - RestTemplate

c# - C# async 和 Java ExecutorService 的区别

java - (Android) 更改 strings.xml 中的文本颜色

Java-XML 数据解析

java - 如何构建分布式 Java 应用程序?

java - 使用 JavaScript 更改 JSP 自定义标记的 JSP 自定义属性值