Java 如何使用XSL动态设置属性值
我是xslt新手,我正在做一个聊天应用程序,我想将用户会话保存为xml文件,并以用户预定义的颜色和字体显示,所以我使用xslt实现了这一点,但我不知道如何从xml中获取字体,并将其应用到html标记中,使其与用户选择的字体一起显示Java 如何使用XSL动态设置属性值,java,html,xml,xslt,Java,Html,Xml,Xslt,我是xslt新手,我正在做一个聊天应用程序,我想将用户会话保存为xml文件,并以用户预定义的颜色和字体显示,所以我使用xslt实现了这一点,但我不知道如何从xml中获取字体,并将其应用到html标记中,使其与用户选择的字体一起显示 <xsl:choose> <xsl:when test="/body/msg[italic/text()='true']"> <i> <font family="/body/ms
<xsl:choose>
<xsl:when test="/body/msg[italic/text()='true']">
<i>
<font family="/body/msg[font/text()] color="/body/msg/color">
<xsl:value-of select="from" /><p>: </p>
<xsl:value-of select="content"/><br/>
</font>
</i>
</xsl:when>
<xsl:when test="/body/msg[bold/text()='true']">
<b>
<font family="/body/msg[font/text()]" color="/body/msg/color">
<xsl:value-of select="from" /><p>: </p>
<xsl:value-of select="content"/><br/>
</font>
</b>
</xsl:when>
<xsl:when test="/body/msg[bold/text()='true'] and /body/msg[italic/text()='true']">
<b>
<i>
<font family="/body/msg[font/text()]" color="/body/msg/color">
<xsl:value-of select="from" /><p>: </p>
<xsl:value-of select="content"/><br/>
</font>
</i>
</b>
</xsl:when>
</xsl:choose>
在没有看到输入格式的情况下很难猜测,但是我认为您正在寻找属性值模板(在文本结果元素属性值中使用{}
)。如果你改变
<font family="/body/msg[font/text()]" color="/body/msg/color">
到
然后family
和color
属性将通过计算这些Xpath获得值,尽管家族的Xpath看起来非常可疑。上面给出了整个msg元素的字符串值,我想它应该更像/body/msg/font
来提取font元素的字符串值。(如果可能,通常最好避免使用text()
)如果没有看到输入格式,很难猜测,但是我认为您正在寻找属性值模板(在文本结果元素属性值中使用{}
)。如果你改变
<font family="/body/msg[font/text()]" color="/body/msg/color">
到
然后family
和color
属性将通过计算这些Xpath获得值,尽管家族的Xpath看起来非常可疑。上面给出了整个msg元素的字符串值,我想它应该更像/body/msg/font
来提取font元素的字符串值。(如果可能的话,通常最好避免使用text()
)我可以建议使用这样的方法吗?如果可能,最好避免重复代码的大部分内容(这称为,根据以下内容,如果您需要对
部分及其内部内容进行更改,则无需在三个位置进行更改。这也可以处理既不指定粗体
也不指定斜体
的情况,而您目前不考虑这一情况:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="body">
<body>
<xsl:apply-templates select="msg" />
</body>
</xsl:template>
<xsl:template match="msg">
<xsl:param name="formatting" select="bold | italic"/>
<xsl:choose>
<xsl:when test="$formatting[self::bold and . = 'true']">
<b>
<xsl:apply-templates select=".">
<xsl:with-param name="formatting" select="$formatting[not(self::bold)]" />
</xsl:apply-templates>
</b>
</xsl:when>
<xsl:when test="$formatting[self::italic and . = 'true']">
<i>
<xsl:apply-templates select=".">
<xsl:with-param name="formatting" select="$formatting[not(self::italic)]" />
</xsl:apply-templates>
</i>
</xsl:when>
<xsl:otherwise>
<font family="{font}" color="{color}">
<xsl:value-of select="from" />
<p>: </p>
<xsl:value-of select="content"/>
<br/>
</font>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
:
在该输入上运行时:
<root>
<body>
<msg>
<bold>true</bold>
<italic>false</italic>
<font>Arial</font>
<color>Blue</color>
<from>Shelly</from>
<content>Hey, how are you doing?</content>
</msg>
<msg>
<bold>false</bold>
<italic>true</italic>
<font>Times New Roman</font>
<color>Red</color>
<from>Tom</from>
<content>What's up?</content>
</msg>
<msg>
<bold>false</bold>
<italic>false</italic>
<font>Courier</font>
<color>Yellow</color>
<from>Fred</from>
<content>I've been trying to reach you</content>
</msg>
<msg>
<bold>true</bold>
<italic>true</italic>
<font>Comic Sans</font>
<color>Green</color>
<from>Lisa</from>
<content>Talk to you later.</content>
</msg>
</body>
</root>
真的
假的
Arial
蓝色
雪莉
嘿,你好吗?
假的
真的
新罗马时代
红色
汤姆
怎么了?
假的
假的
信使
黄色的
弗莱德
我一直在找你
真的
真的
喜剧演员
绿色
丽莎
待会儿再谈。
产生:
<body>
<b>
<font family="Arial" color="Blue">
Shelly<p>: </p>Hey, how are you doing?<br />
</font>
</b>
<i>
<font family="Times New Roman" color="Red">
Tom<p>: </p>What's up?<br />
</font>
</i>
<font family="Courier" color="Yellow">
Fred<p>: </p>I've been trying to reach you<br />
</font>
<b>
<i>
<font family="Comic Sans" color="Green">
Lisa<p>: </p>Talk to you later.<br />
</font>
</i>
</b>
</body>
雪莉:嘿,你好吗?
汤姆:怎么了
弗雷德:我一直在找你
Lisa:稍后再跟你谈。
我可以建议使用这样的方法吗?如果可能,最好避免重复代码的大部分内容(这称为,根据以下内容,如果您需要对
部分及其内部内容进行更改,则无需在三个位置进行更改。这也可以处理既不指定粗体
也不指定斜体
的情况,而您目前不考虑这一情况:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="body">
<body>
<xsl:apply-templates select="msg" />
</body>
</xsl:template>
<xsl:template match="msg">
<xsl:param name="formatting" select="bold | italic"/>
<xsl:choose>
<xsl:when test="$formatting[self::bold and . = 'true']">
<b>
<xsl:apply-templates select=".">
<xsl:with-param name="formatting" select="$formatting[not(self::bold)]" />
</xsl:apply-templates>
</b>
</xsl:when>
<xsl:when test="$formatting[self::italic and . = 'true']">
<i>
<xsl:apply-templates select=".">
<xsl:with-param name="formatting" select="$formatting[not(self::italic)]" />
</xsl:apply-templates>
</i>
</xsl:when>
<xsl:otherwise>
<font family="{font}" color="{color}">
<xsl:value-of select="from" />
<p>: </p>
<xsl:value-of select="content"/>
<br/>
</font>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
:
在该输入上运行时:
<root>
<body>
<msg>
<bold>true</bold>
<italic>false</italic>
<font>Arial</font>
<color>Blue</color>
<from>Shelly</from>
<content>Hey, how are you doing?</content>
</msg>
<msg>
<bold>false</bold>
<italic>true</italic>
<font>Times New Roman</font>
<color>Red</color>
<from>Tom</from>
<content>What's up?</content>
</msg>
<msg>
<bold>false</bold>
<italic>false</italic>
<font>Courier</font>
<color>Yellow</color>
<from>Fred</from>
<content>I've been trying to reach you</content>
</msg>
<msg>
<bold>true</bold>
<italic>true</italic>
<font>Comic Sans</font>
<color>Green</color>
<from>Lisa</from>
<content>Talk to you later.</content>
</msg>
</body>
</root>
真的
假的
Arial
蓝色
雪莉
嘿,你好吗?
假的
真的
新罗马时代
红色
汤姆
怎么了?
假的
假的
信使
黄色的
弗莱德
我一直在找你
真的
真的
喜剧演员
绿色
丽莎
待会儿再谈。
产生:
<body>
<b>
<font family="Arial" color="Blue">
Shelly<p>: </p>Hey, how are you doing?<br />
</font>
</b>
<i>
<font family="Times New Roman" color="Red">
Tom<p>: </p>What's up?<br />
</font>
</i>
<font family="Courier" color="Yellow">
Fred<p>: </p>I've been trying to reach you<br />
</font>
<b>
<i>
<font family="Comic Sans" color="Green">
Lisa<p>: </p>Talk to you later.<br />
</font>
</i>
</b>
</body>
雪莉:嘿,你好吗?
汤姆:怎么了
弗雷德:我一直在找你
Lisa:稍后再跟你谈。
使用XSLT生成关注演示文稿的HTML会让您无所事事。如果您希望生成用户可选择的主题,您应该使用CSS,或者使用一致标记的XSLT生成,或者使用通过转换附加的外部文件中的预定义类。使用XSLT生成演示文稿如果你想生成用户可选择的主题,你应该使用CSS,或者从XSLT生成一致的标记,或者在通过转换附加的外部文件中使用预定义的类。