【问题标题】:How to remove patterns using xslt?如何使用 xslt 删除模式?
【发布时间】:2012-01-05 10:44:12
【问题描述】:

我正在尝试使用 xslt 显示一个 xml 文件。在某些节点中,我在<code> 标签之间有数据。我不想显示代码标签。

那么如何使用 xslt 单独删除 <code></code> 标记。

我尝试了 translate(),但它认为模式是单独的字符,因此所有的 c、o、d、e 也会从 xml 内容中删除。

这是一个示例 xml 数据:

  <results>
  <result>
     <resultType>Error</resultType>
     <lineNum>3</lineNum>
     <columnNum>1</columnNum>
     <errorMsg>&lt;code&gt;script&lt;/code&gt; may cause screen flicker.&lt;</errorMsg>
   </result> 
   <result>   
    <resultType>Potential Problem</resultType>
    <lineNum>6</lineNum>
    <columnNum>2</columnNum>
    <errorMsg>&lt;code&gt;script&lt;/code&gt; user interface may not be accessible.&lt;
  </errorMsg>
 </result> 
 </results>

我的 xslt:

    <table>
     <tr class="header">
      <th>Serial Number</th>
      <th>Line Number</th>
      <th>Error Message</th>
      <th>Decision Pass</th>

     </tr>
     <xsl:for-each select="results/result">
      <xsl:if test="resultType='Potential Problem'">
        <xsl:variable name="eMsg" select="errorMsg"></xsl:variable>
        <tr class="content">  

            <td><xsl:number format="1"/></td>

            <td><xsl:value-of select="lineNum"/></td>

            <td><xsl:value-of select="errorMsg" disable-output-escaping="yes"/></td>

        </tr>
      </xsl:if> 
    </xsl:for-each>
  </table>

disable-output-escaping="yes" 不适用于 Firefox,因此请尝试删除 &amp;lt;code&amp;gt;&lt;/code&gt; 标签

【问题讨论】:

  • 我只看到转义代码标签 (&amp;lt;code&amp;gt;) - 即没有真正的 标签(在单独的 DOM 实体中)
  • 但它在浏览器中显示为&amp;lt;code&amp;gt;..
  • 这不是重点。如果您将其称为标签,它会使试图回答问题的人感到困惑,而实际上它已被小心地转义以防止将其视为标签。
  • 哦,好吧.. 很抱歉造成混乱.. 我实际上是 xml n xslt 的新手,所以我不知道这一切

标签: xml xslt


【解决方案1】:

如果你想去掉一个实际的 XML 元素,你会使用这样的东西:

<xsl:template match="code">
  <xsl:apply-templates/>
</xsl:template>

(假设您有一个可以复制其他所有内容的身份模板:

<xsl:template match="@*|node()">
  <xsl:copy><xsl:apply-templates/></xsl:copy>
</xsl:template>

)

但是,看起来您所拥有的实际上是您想要删除的文本。在这种情况下,xsl:analyze-string 可能就是您所需要的:

<xsl:template match="errorMsg/text()">
  <xsl:analyze-string select="." regex="&amp;lt;code$amp;gt;(.*)&amp;lt;/code$amp;gt;">
    <xsl:matching-substring><xsl:value-of select="regex-group(1)"/></xsl:matching-substring>
    <xsl:non-matching-substring><xsl:value-of select="."/></xsl:non-matching-substring>
  </xsl:analyze-string>
</xsl:template>

其他一些提示和意见:如果您在可以使用模板时使用 for-each,则应该考虑后者。禁用输出转义是魔鬼,应该在 99% 的时间(或更多时间)避免。

希望能做到!

【讨论】:

  • 有疑问,什么是正则表达式组(1)?是否应该在其他地方定义?
  • regex-group 由分析字符串定义,尽管我认为这仅在 XSLT 2 中可用,因此在这里可能对您没有帮助。
  • 啊,没有意识到这是 XSLT 1.0。如果有意义的话,regex-group(n) 将返回 @regex 内第 n 组括号中匹配的任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 2021-09-17
相关资源
最近更新 更多