【问题标题】:Removing double quotes and slashes in XSLT删除 XSLT 中的双引号和斜杠
【发布时间】:2018-11-01 18:02:49
【问题描述】:

我试图在进行 XSLT 翻译时过滤掉问题字符(引号和斜杠),但实际上无法删除它们。我在这里尝试了几种建议的解决方案,但均未成功:

Replace special characters in XSLT

Removing double quotes in XSL

XSL: replace single and double quotes with ' and "

理想情况下,我希望将字符替换为某种标记词,例如 quotesslash,但此时我只需将它们去掉就可以了暂时。

我只在几个选择上运行它,所以应该不会那么难。我不确定出了什么问题。

<xsl:value-of select="ns3:stepTitle"/>

编辑:

需要使用 XML 1.0。

XSLT:

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

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

    <xsl:template match="*/text()">
        <xsl:value-of select="translate(., '\&quot;', '*quote*')"/>
    </xsl:template>

</xsl:stylesheet>

XML:

<test>
  I need to remove "quotes" and slashes /\ from here.
</test>

结果是:

<?xml version="1.0" encoding="UTF-16"?>
<test>
  I need to remove qquotesq and slashes /* from here.
</test>

【问题讨论】:

  • 您有minimal reproducible example 来显示您的确切问题吗?
  • 如果您不告诉我们您在做什么,我们当然无法判断您做错了什么。如果您向我们展示您的代码,我们可以告诉您哪里出错了。如果您向我们展示您的输入和所需的输出,我们可以建议如何编写代码。既没有输入,也没有输出,也没有代码,我们无能为力。
  • 另外,我们需要知道您是否可以使用 XSLT 2.0(或 3.0),因为这使大多数事情变得容易得多。
  • 你是对的。我对此感到抱歉。我需要为此使用 XML 1.0。请参阅对问题的编辑以进行澄清。

标签: xml xslt


【解决方案1】:

不是 100% 清楚您的问题是什么,但我猜这是this old thread from 2001 中描述的问题的变体。如果是这样,以下是一个示例 XSLT 1.0 样式表,用于将 ASCII 撇号字符替换为 U+2019 RIGHT SINGLE QUOTATION MARK(十进制的 Unicode 代码点 8217)字符。 “技巧”是定义一个包含撇号字符的单字符串变量,然后在对translate() 的调用中使用该变量(但也可以与concat() 一起使用以创建带有撇号字符的字符串): /p>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="text()">
    <xsl:variable name="apos" select='"&apos;"'/>
    <xsl:variable name="string-containing-quotes" select="."/>
    <xsl:variable name="string-with-quotes-replaced"
         select="translate($string-containing-quotes, $apos, '&#8217;')"/>
    <xsl:value-of select="$string-with-quotes-replaced"/>
  </xsl:template>
</xsl:stylesheet>

您可以使用测试 XML 输入文档来测试样式表,例如

<test>
  Text containing 'apostrophe' characters
</test>

【讨论】:

  • 这是解决问题的一种有趣方法。我没有用单引号替换它,而是尝试用 quote 替换它,输出结果为“包含 撇号 字符的文本”而不​​是“包含 quote撇号quote characters" 你知道为什么会这样吗?我想如果我可以只使用 quote 或其他变体(斜杠大于等)会更容易,因为我正在尝试把它变成 RDF 很多编辑不喜欢某些字符
  • @JosephShea 使其适用于双引号字符,您需要将带有双引号字符的单字符串声明为 XML 属性(外部)分隔符,并使用单引号/撇号字符来分隔XSLT 字符串文字,如@9​​87654328@(然后在答案中的示例代码中使用quot,如apos
  • 当我这样做并尝试用字符串替换引号时,它似乎只取了字符串的第一个字母,而不是全部。有没有办法让它用几个字符的完整字符串替换引号?
  • translate() 根据the XPath 1.0 spec 只替换单个字符;如果您想用多字符串替换单个字符,则必须使用其他内容
  • 参见例如。 stackoverflow.com/questions/7520762/… 用于替换 XSLT 1.0 中的多字符串;但既然你说你“想过滤掉问题字符”,也许你仍然可以使用translate(),第三个参数留空,在这种情况下,XSLT 将删除个字符
【解决方案2】:

translate 函数的广为人知的特征可能是 replace 字符串(第三个参数)可以比 from 字符串(第二个参数)

在这种情况下,字符串(第一个参数)中的字符:

  • 发生在 from 字符串中,
  • 替换字符串中没有对应的字符

被删除。

所以你必须使用translate(., '/&amp;quot;', '')

from 字符串有 2 个字符:斜杠 (/) 和双引号 &amp;quot; 并且 replace 字符串为空,因此这两个字符都将被删除。

示例脚本如下:

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

  <xsl:template match="*/text()">
    <xsl:value-of select="translate(., '/&quot;', '')"/>
  </xsl:template>

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

注意:在您的示例中,您放置了 反斜杠(不是正斜杠)。

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多