gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:57:29 24 4
gpt4 key购买 nike

我试图在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com