【问题标题】:xslt removing punctuationxslt 删除标点符号
【发布时间】:2012-06-25 17:21:07
【问题描述】:

谁能告诉我为什么下面的代码行不是使用 xslt 1.0 为段落元素的文本节点删除句点和逗号的合法方法?这是我目前拥有的模板:

<xsl:template match="tei:p">
    <p id="{@xml:id}" class="plaoulparagraph" style="margin-left: 3em;"><xsl:apply-templates select="./translate(current(), '.,', '')"/></p>
</xsl:template>

当我尝试执行此操作时,我的编辑器当前给我一个错误。

【问题讨论】:

    标签: xslt translate


    【解决方案1】:
    <xsl:apply-templates select="./translate(current(), '.,', '')"/>
    

    在 XSLT 1.0 和 2.0 中,xsl:apply-templatesselect 属性中的表达式必须计算为节点集

    上述指令的 select 属性在 XPath 1.0 中在语法上是无效的,因为在 XPath 1.0 中,不允许将函数调用作为 / 运算符的 RHS(感谢 @MichaelKay 指出这一点)在 XPath 2.0 中,它计算为字符串,而不是节点集——这就是错误的原因。

    你想做这样的事情

    <xsl:template match="tei:p//text()">
     <xsl:value-of select="translate(., '.,', '')"/>
    </xsl:template>
    

    并将上面引用的指令替换为

     <xsl:apply-templates/>
    

    【讨论】:

    • 此外,在 XSLT 1.0 中,您不能在“/”运算符的 rhs 上调用函数。
    • @MichaelKay:感谢您的良好观察——我在解释中添加了这个额外的错误。
    • 哈——这是一个非常聪明的解决方案。它似乎有效——但是,我假设如果

      有带有标点符号的孩子,我还需要运行单独的模板来删除标点符号——比如对于

      的孩子的 ,即 @ 987654328@

    • @Jeff:实际上你不必必须这样做。 tei:p//text() 匹配作为 tei:/p 后代的所有文本节点。
    【解决方案2】:

    使用这个

    <p class="plaoulparagraph" style="margin-left: 3em;"><xsl:value-of select="translate(current(), '.,', '')"/></p>
    

    【讨论】:

    • 我想过这个 roue,但我不确定这会给我想要的东西。 p 标签包含许多子元素——所以我想确保在 p 的所有子元素上应用模板。如果只选择 P 的值——那么我不确定其他更具体的模板是否得到处理。
    【解决方案3】:

    如果您正在处理数字的逗号,您可以这样翻译:

    <xsl:variable name="string_value">
       <xsl:value-of select="'123,456,789.01'"/>
    </xsl:variable>
    
    <Number>
        <xsl:value-of select="number(translate($string_value,',',''))"/>
    <Number>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-14
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多