【问题标题】:How to extract part of an attributes value using XSLT如何使用 XSLT 提取属性值的一部分
【发布时间】:2015-02-19 23:42:53
【问题描述】:

我在 HTML 文件(或类似文件)中有以下代码行:

...
<a href="#SCRIPT_NAME#?a=b&id=a/b/c/d">Link Content</a>
...

我需要能够提取hrefa/b/c/d 部分并将链接转换为类似:

<a href="/lookup?id=a/b/c/d">Link Content</a>

理想情况下,我希望能够使用正则表达式来做到这一点,但我在 StackOverflow 上为 XSLT 看到的大多数正则表达式内容似乎都需要 XPath 2。

是的...我在 PHP5.3 上使用 SimpleXML/DomDocument 来应用我相信不支持 v2 xslt 的样式表。

我想我可以做字符串替换来丢失第一部分,但我想要一个模式匹配来提取它。

有什么想法吗?

【问题讨论】:

    标签: php regex xslt xpath simplexml


    【解决方案1】:

    正如 michael.hor257k 给出的答案中已经指出的那样,您必须调整 &amp; 字符才能获得有效的 XML。给定一个包含例如的输入

    <a href="#SCRIPT_NAME#?a=b&amp;id=a/b/c/d">Link Content</a>
    

    以下模板

    <xsl:template match="a/@href[starts-with(.,'#SCRIPT_NAME#')]">
       <xsl:attribute name="href">
         <xsl:value-of select="concat('/lookup?id=', substring-after(.,'id='))"/>
      </xsl:attribute>
    </xsl:template>
    

    将链接更改为

    <a href="/lookup?id=a/b/c/d">Link Content</a>
    

    匹配以#SCRIPT_NAME#开头的每个href
    虽然从问题中不清楚哪个是必须匹配的部分/如何识别必须调整的链接,但您可能可以调整此示例以满足您的要求或为您的问题提供进一步的输入。

    【讨论】:

    • 谢谢马蒂亚斯,我现在就试试 :)
    • 工作完美,感谢马蒂亚斯。还要感谢@michael.hor257k 的初步建议。
    【解决方案2】:

    我在 StackOverflow 上为 XSLT 看到的大部分正则表达式内容似乎都是 需要 XPath 2。

    不是大多数:全部。除非您的特定 XSLT 1.0 处理器提供正则表达式作为(特定于处理器的)扩展。

    现在,您的问题中缺少的部分是如何识别要从现有值中提取的部分。例如,如果总是出现在(第一次出现)“id=”之后的子字符串,那么您可以使用 substring-after() 函数来检索它。

    或者至少理论上可以。在实践中,nothing 将适用于给定的示例,因为它包含未转义的 &amp;amp; 字符 - XML 中的一个大禁忌。

    【讨论】:

    • 谢谢迈克尔,我会去看看。你说得对,我需要查询字符串的 ID= 部分。
    • 在解析为 xml 之前,我也会对其进行编码。昨晚写这个的时候打错了。我 str_replace &amp;amp;&amp;amp; 在路上,反之亦然。
    【解决方案3】:

    这只是在黑暗中的一个镜头,但如果您特别希望使用正则表达式来解决这个问题,您可能可以使用以下内容:

    $xslt_string = '<a href="#SCRIPT_NAME#?a=b&id=a/b/c/d">Link Content</a>';
    preg_match('/href=".+?id=(.+?)"/', $xslt_string, $matches);
    print_r($matches);
    

    https://regex101.com/r/rY7oY7/1

    【讨论】:

    • 我知道我可以很容易地在原生的 php 中做到这一点。但是,我希望在 xslt 中包含我所有的“翻译”代码,而不是“在那儿做一些,在这儿做一些”。最终这将在 Drupal 中结束,因此我还可以使用输入过滤器来纠正这些输出。与 PHP 的所有东西一样,有很多方法可以给猫剥皮 :)
    • 我认为这不是一个好主意,因为在将正则表达式应用于字符串之前,您必须找到该字符串。 IOW,您必须 解析 输入 XML - 和 everyone knows,您无法使用正则表达式解析 X/THML。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多