Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用XSL动态设置属性值_Java_Html_Xml_Xslt - Fatal编程技术网

Java 如何使用XSL动态设置属性值

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

我是xslt新手,我正在做一个聊天应用程序,我想将用户会话保存为xml文件,并以用户预定义的颜色和字体显示,所以我使用xslt实现了这一点,但我不知道如何从xml中获取字体,并将其应用到html标记中,使其与用户选择的字体一起显示

<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生成一致的标记,或者在通过转换附加的外部文件中使用预定义的类。