【问题标题】:XSLT: Conditional text exclusion/replacementXSLT:条件文本排除/替换
【发布时间】:2018-11-01 14:06:26
【问题描述】:

我的任务是作为 POC 第一次做一些 xslt 并在解决方案中磕磕绊绊。我的问题 能够在匹配发生时用我的函数返回的内容替换节点的内容。在 那一刻我在将它放在一起时遇到问题,以至于运行标签内的原始文本也无法通过 因为当测试为 TRUE 时,应该用我的句柄链接函数定义的内容替换它。 michael.hor257k 给了 在以前的帖子中针对我的问题提出了一些很好的建议,该帖子现已关闭,但我仍然对正确的语法感到困惑 我需要申请才能达到预期的结果。如果有人可以帮助我进行正确的修改,那将是 非常好,非常感谢。

给定以下 XML。

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
    <par def='15'>
        <run>
            <font size='8pt' name='Verdana' pitch='variable' truetype='true'
 familyid='20' color='navy'/>[&lt;a href="www.google.com.au" target="_new"&gt;Google&lt;/a&gt;]
        </run>
    </par>
</catalog>

并应用正确的 XSLT(我需要帮助)

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

    <xsl:template match="/">
        <html>
            <body>
                <h2>My Transform</h2>  
                <xsl:apply-templates/>  
            </body>
        </html>
    </xsl:template>

    <xsl:template match="run">
        <font name='Verdana' size='14pt'>
            <xsl:call-template name="handle-links">
                <xsl:with-param name="txt" select="."/>
            </xsl:call-template>
        </font>
    </xsl:template>

    <xsl:template name="handle-links">

        <xsl:param name="txt"/>

        <xsl:if
            test="contains($txt,'[&lt;a')">

            <xsl:variable name="quotes">"</xsl:variable>    

            <!-- Get URL -->
            <xsl:variable name="urlVar" select='substring-before(substring-after($txt, $quotes), $quotes)'/> 

            <!-- Get Link Name -->
            <xsl:variable name="linkName" select='substring-before(substring-after($txt, "&gt;"), "&lt;")'/> 

            <a href="{$urlVar}">
                <xsl:value-of select="$linkName"/>
            </a>
        </xsl:if>

    </xsl:template>

</xsl:stylesheet>

如果并且仅当测试 test="contains($txt,'[ 为真时,我正在尝试实现类似以下的目标。

<font name='Verdana' size='14pt'>
    <a href="www.google.com">Google</a>
</font>

如果测试 test="contains($txt,'[&amp;lt;a')"&gt; 为 FALSE,那么我只希望 &lt;font name = 'Verdana' size='14pt'&gt; &lt;/font&gt; 标记围绕运行元素的 text() 内容。

干杯,

【问题讨论】:

  • contains($txt,'[&lt;a') 为真的情况下,上述XSLT 确实会输出您想要的内容。它只是您需要帮助的“虚假”案例吗?谢谢!
  • 嗨蒂姆,是的,我也需要它来处理错误情况。我一直在 XSLT Tryit Editor v1.2 中使用不同的排列,并且无法获得上述代码来生成输出,因此假设它存在问题。如果有更好的编辑器可用于试验/调试,请告诉我,因为它将有助于该项目的未来工作。干杯

标签: xml xslt


【解决方案1】:

一种方法是使用xsl:choose 而不是xsl:if

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <h2>My Transform</h2>  
        <xsl:apply-templates/>  
      </body>
    </html>
  </xsl:template>

  <xsl:template match="run">
    <font name='Verdana' size='14pt'>
      <xsl:call-template name="handle-links">
        <xsl:with-param name="txt" select="."/>
      </xsl:call-template>
    </font>
  </xsl:template>

  <xsl:template name="handle-links">
    <xsl:param name="txt"/>
    <xsl:choose>
     <xsl:when test="contains($txt,'[&lt;a')">
        <xsl:variable name="quotes">"</xsl:variable>  
          <!-- Get URL -->
        <xsl:variable name="urlVar" select='substring-before(substring-after($txt, $quotes), $quotes)'/> 
          <!-- Get Link Name -->
        <xsl:variable name="linkName" select='substring-before(substring-after($txt, "&gt;"), "&lt;")'/> 

        <a href="{$urlVar}">
          <xsl:value-of select="$linkName"/>
        </a>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$txt" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

另一种方法是让模板匹配文本节点,而不是命名模板,并让模板中的条件匹配。也试试这个

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <h2>My Transform</h2>  
        <xsl:apply-templates/>  
      </body>
    </html>
  </xsl:template>

  <xsl:template match="run">
    <font name='Verdana' size='14pt'>
      <xsl:apply-templates select="text()" />
    </font>
  </xsl:template>

  <xsl:template match="run/text()[contains(.,'[&lt;a')]">
    <xsl:variable name="quotes">"</xsl:variable>  
      <!-- Get URL -->
    <xsl:variable name="urlVar" select='substring-before(substring-after(., $quotes), $quotes)'/> 
      <!-- Get Link Name -->
    <xsl:variable name="linkName" select='substring-before(substring-after(., "&gt;"), "&lt;")'/> 

    <a href="{$urlVar}">
      <xsl:value-of select="$linkName"/>
    </a>
  </xsl:template>
</xsl:stylesheet>

在文本不包含链接的情况下,XSLT 的内置模板只会正常输出文本。

http://xsltfiddle.liberty-development.net/pPqsHUn 上查看实际操作(该网站对于实验和调试非常有用。它还支持 XSLT 3.0,如果您可以使用它将允许您使用 parse-xml 命令,以潜在地创建链接更容易)。

【讨论】:

  • 这太棒了,感谢 Tim C。我刚刚开始玩 .NET XSLT Fiddle,它很棒。很高兴看到可以采取的各种方法,非常感谢分享。
猜你喜欢
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多