在XSLT

时间:2017-08-29 12:52:08

标签: xml attributes xslt-2.0

我尝试使用XSLT来显示我得到的一些结果(我的想法是为QWebView生成一个不错的HTML)。

我是XSLT的初学者,我无法知道如何获得以下结果。 (这是一个例子)

输入

<object name="object_name">
    <property1 diff="modified">value1</property1>
    <property2>value2</property2>
</object>

输出

<p>object_name</p>
<ul>
    <li>
        property1 = <span style="color : #ff00000 ; font-weight : bold ;">value1</span>
    </li>
    <li>
        property2 = value2
    </li>
</ul>

所以我想添加&#34; span&#34;每当我遇到一个&#34; diff&#34;属性(并将样式调整为属性值)

现在,我正在做这样的事情:

    <xsl:template match="object">
        <p>
            <xsl:value-of select="@object_name"/>
        </p>
        <ul>
            <xsl:apply-templates />
        </ul>
    </xsl:template>

    <xsl:template match="object/*">
        <li>
            <xsl:sequence select="local-name(.)"/> = <xsl:value-of select="."/>
        </li>
    </xsl:template>

除了&#34; span&#34;我得到了我想要的东西。标签......我无法找到如何让它发挥作用...... 这是我试图编写并插入的代码片段,但没有成功:

<xsl:template match="*[@diff = 'modified']">
    <span style="color : #ff0000 ; font-weight : bold ;">iDontKnowWhatToWrite</span>
</xsl:template>

提前感谢任何建议或重定向

编辑:添加精度:感谢在对象/ *匹配中获取属性值匹配的想法,但我想找到一个单独匹配的解决方案,因为我将使用与其他标签相同的匹配。

我不知道我是否非常清楚...事实上,这个XSLT将使用我所展示的标签处理XML,但是会有几个不同输出的标签,例如和但是现在我正在做第一种工作,但我希望保持这个&#34; diff&#34;整个文档的属性行为(任何时候遇到它,我都希望将以下内容嵌入&#34; span&#34;标记)

2 个答案:

答案 0 :(得分:0)

你可以用这个:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">

    <xsl:template match="object">
        <p>
            <xsl:value-of select="@object_name"/>
        </p>
        <ul>
            <xsl:apply-templates />
        </ul>
    </xsl:template>

    <xsl:template match="object/*">
        <li>
            <xsl:sequence select="local-name(.)"/> = <xsl:choose>
                <xsl:when test="@diff = 'modified'">
                    <span style="color : #ff00000 ; font-weight : bold ;">
                        <xsl:value-of select="."/>
                    </span>
                </xsl:when>
                <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
            </xsl:choose>
        </li>
    </xsl:template>
</xsl:stylesheet>

或者您可以使用此

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">

    <xsl:template match="object">
        <p>
            <xsl:value-of select="@object_name"/>
        </p>
        <ul>
            <xsl:apply-templates />
        </ul>
    </xsl:template>

    <xsl:template match="object/*">
        <li>
            <xsl:sequence select="local-name(.)"/> = <xsl:value-of select="."/>
        </li>
    </xsl:template>

    <xsl:template match="*[@diff = 'modified']">
        <li>
            <xsl:sequence select="local-name(.)"/> = <span style="color : #ff00000 ; font-weight : bold ;"><xsl:value-of select="."/></span>
        </li>
    </xsl:template>


</xsl:stylesheet>

答案 1 :(得分:0)

正如我在编辑问题中所解释的那样,我需要一个比提议的答案/评论更通用的解决方案。 这是我做的,耦合条件选择/何时/否则结构和模板参数。

<xsl:template match="object">
    <p>
        <xsl:value-of select="@object_name"/>
    </p>
    <ul>
        <xsl:apply-templates />
    </ul>
</xsl:template>

<xsl:template match="object/*">
    <li>
        <xsl:sequence select="local-name(.)"/> = <xsl:value-of select="."/>
    </li>
</xsl:template>

<xsl:template match="*[@diff = 'modified']">
    <li>
        <xsl:sequence select="local-name(.)"/> = 
        <xsl:call-template name="processContent">
            <xsl:with-param name="contentValue"><xsl:value-of select="."/></xsl:with-param>
            <xsl:with-param name="diffAttr"><xsl:value-of select="@diff"/></xsl:with-param>
        </xsl:call-template>
    </li>
</xsl:template>

    <xsl:template name="processContent">
    <xsl:param name="contentValue" />
    <xsl:param name="diffAttr" select="" />

    <xsl:choose>
        <xsl:when test="$diffAttr = 'modified'">
            <span style="color : #ff0000 ; font-weight : bold ;">
                <xsl:value-of select="$contentValue"/>
            </span>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$contentValue"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

(这是我最通用的解决方案,因为我可以将此模板重用于其他标签,我甚至可以轻松地将其扩展到其他diff属性值)