与 Xsl 连接

Posted

技术标签:

【中文标题】与 Xsl 连接【英文标题】:Concat with Xsl 【发布时间】:2012-10-25 15:35:50 【问题描述】:

首先让我说我是 Xsl 的菜鸟。我正在尝试完成我觉得很简单的事情,但是我很难理解语法。

我有一个获取位置名称的变量(例如芝加哥或奥兰)

然后我有一个变量可以获取没有区号的电话号码。

所以我要做的是一个 If 语句,如果位置是芝加哥 (773) 或奥兰 (708),则 Concat("区号" 和 "电话号码") 基于。

变量:

xsl:variable name="haswph"       select="string-length(workphone) > 0"
xsl:variable name="hasonum"      select="string-length(officenumber) > 0"

输出:

  <xsl:if test="$haswph">
    <li id="PhoneField">
      <xsl:apply-templates select="hithighlightedproperties/workphone" />
    </li>
  </xsl:if>
  <xsl:if test="$hasonum">
    <li id="OfficeField">
      <xsl:apply-templates select="hithighlightedproperties/officenumber" />
    </li>
  </xsl:if>

任何建议或正确方向的观点将不胜感激。

谢谢, 布兰登

<preferredname>Nigro, Brandon L.</preferredname> 
<yomidisplayname></yomidisplayname>
<department>Information Technology</department> 
<workphone>555-5555</workphone>
<officenumber>John Academic Center</officenumber>

【问题讨论】:

请编辑您的帖子以包含输入 XML 和所需输出的示例。另外,输入中的“位置”在哪里?您还没有说明是什么决定了办公室是芝加哥还是奥兰多 它来自 AD,这个 xsl 是来自 SharePoint webpart 的一个块。 很好,但是我们仍然需要查看输入和输出的示例,以及 XML“位置”的来源。 请原谅我的无能。我相信输入已经从 AD 设置,就在 Web 部件加载时。在代码的顶部,WorkPhone 已经设置了我的号码,并且与 officenumber 相同。我在原始帖子中添加了 XML 代码。 【参考方案1】:

如果我正确理解了这个问题,解决方案只需将此模板添加到您当前的 xsl:

<xsl:template match="workphone">
    <xsl:if test="$office='Chicago'">(773) </xsl:if>
    <xsl:if test="$office='Orland'">(708) </xsl:if>
    <xsl:value-of select="."/>
</xsl:template>

用您在原始帖子中提到的变量替换这个“$office”变量。

编辑:在这里您有一个完整的转换,其中以前的模板应用于示例输入 XML(顺便说一句:尝试遵循 Jim Garrison 的建议。发布完整的输入/输出 XML,而不是其中的一部分)以后的帖子,您将在第一次尝试时得到确切的响应)。

输入:

    <Office code="Chicago">
        <Employee id="1">
            <hithighlightedproperties>
                <preferredname>Nigro, Brandon L.</preferredname>
                <yomidisplayname></yomidisplayname>
                <department>Information Technology</department>
                <workphone>555-5555</workphone>
                <officenumber>John Academic Center</officenumber>
            </hithighlightedproperties>
        </Employee>
    </Office>

XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes"/>
    <xsl:variable name="office" select="Office/@code"/>
    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
    <xsl:template match="Office">
        <html>
            <body>
                <xsl:apply-templates select="Employee"/>
            </body>
        </html>
    </xsl:template>
    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
    <xsl:template match="Employee">
        <xsl:variable name="haswph" select="string-length(hithighlightedproperties/workphone) &gt; 0"/>
        <xsl:variable name="hasonum" select="string-length(hithighlightedproperties/officenumber)&gt; 0"/>
        <p>Employee <xsl:value-of select="@id"/> Properties</p>
        <ul>
            <li id="Name"><xsl:value-of select="hithighlightedproperties/preferredname"/></li>
            <xsl:if test="string-length(hithighlightedproperties/yomidisplayname)">
                <li id="DisplayNameField">
                    <xsl:apply-templates select="hithighlightedproperties/yomidisplayname"/>
                </li>
            </xsl:if>
            <li id="DepartmentField"><xsl:value-of select="hithighlightedproperties/department"/></li>
            <xsl:if test="$haswph">
                <li id="PhoneField">
                    <xsl:apply-templates select="hithighlightedproperties/workphone"/>
                </li>
            </xsl:if>
            <xsl:if test="$hasonum">
                <li id="OfficeField">
                    <xsl:apply-templates select="hithighlightedproperties/officenumber"/>
                </li>
            </xsl:if>
        </ul>
    </xsl:template>
    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
    <xsl:template match="workphone">
        <xsl:if test="$office='Chicago'">(773) </xsl:if>
        <xsl:if test="$office='Orland'">(708) </xsl:if>
        <xsl:value-of select="."/>
    </xsl:template>
</xsl:stylesheet>

输出:

<html>
    <body>
        <p>Employee 1 Properties</p>
        <ul>
            <li id="NameField">Nigro, Brandon L.</li>
            <li id="DepartmentField">Information Technology</li>
            <li id="PhoneField">(773) 555-5555</li>
            <li id="OfficeField">John Academic Center</li>
        </ul>
    </body>
</html>

但是,我不鼓励您使用这种“变量 + if”的方法,并尝试使用干净的 xsl pushy 样式(这样可以达到完全相同的结果):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes"/>
    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
    <xsl:template match="Office">
        <html>
            <body>
                <xsl:apply-templates select="Employee"/>
            </body>
        </html>
    </xsl:template>
    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
    <xsl:template match="Employee">
        <p>Employee <xsl:value-of select="@id"/> Properties</p>
        <ul>
            <xsl:apply-templates select="hithighlightedproperties/preferredname" mode="li">
                <xsl:with-param name="id" select="'NameField'"/>
            </xsl:apply-templates>
            <xsl:apply-templates select="hithighlightedproperties/yomidisplayname" mode="li">
                <xsl:with-param name="id" select="'DisplayNameField'"/>
            </xsl:apply-templates>
            <xsl:apply-templates select="hithighlightedproperties/department" mode="li">
                <xsl:with-param name="id" select="'DepartmentField'"/>
            </xsl:apply-templates>
            <xsl:apply-templates select="hithighlightedproperties/workphone" mode="li">
                <xsl:with-param name="id" select="'PhoneField'"/>
            </xsl:apply-templates>
            <xsl:apply-templates select="hithighlightedproperties/officenumber" mode="li">
                <xsl:with-param name="id" select="'OfficeField'"/>
            </xsl:apply-templates>
        </ul>
    </xsl:template>
    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
    <xsl:template match="workphone">
        <xsl:variable name="office" select="../../../@code"/>
        <xsl:if test="$office='Chicago'">(773) </xsl:if>
        <xsl:if test="$office='Orland'">(708) </xsl:if>
        <xsl:value-of select="."/>
    </xsl:template>
    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
    <xsl:template match="*[string-length(.)&gt;0]" mode="li">
        <xsl:param name="id" select="local-name()"/>
        <li id="$id">
            <xsl:apply-templates select="."/>
        </li>
    </xsl:template>
</xsl:stylesheet>

【讨论】:

它没有用。 :( 在我将它添加到我的代码之后,没有任何变化。模板是否应该匹配 park 等于 workphone 或者在这种情况下它是否应该等于 workphone 的 ID OfficeField (在第一篇文章中说明)。我也应该把它放在下面或上面的工作电话输出在哪里? 好的,抱歉。也许我给你的信息太少了。现在我将编辑帖子,为您提供所有必需的详细信息 感谢您的耐心等待。我没有意识到 xsl 有 HTML。所以说我想测试一下功能,是不是就这么简单复制到记事本,设置变量,在浏览器中打开? 是的,它应该这样工作。您可以查看其他解释如何设置的答案:***.com/a/1590114/921383

以上是关于与 Xsl 连接的主要内容,如果未能解决你的问题,请参考以下文章

如何在 XSL 中按顺序将所有消息连接在一起?

通过标签值连接来自不同节点的数据

ASP.NET MVC 与 XSL

将 contains 函数与 xsl:key 一起使用

.net/xslt: <xsl:include> 与相对路径导致错误

pdfbox / XSL + FOP 转换 PDF文档