如何使用XSLT提取部分属性值

时间:2015-02-19 23:42:53

标签: php regex xslt xpath simplexml

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

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

我需要能够提取a/b/c/d的{​​{1}}部分并将链接转换为以下内容:

href

理想情况下,我希望能够使用正则表达式执行此操作,但我在StackOverflow上看到的XSLT的大部分正则表达式内容似乎都需要XPath 2.

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

我认为我可以进行字符串替换以丢失第一部分,但我希望有一个模式匹配来提取它。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

  

我在StackOverflow上看到的XSLT的大多数正则表达式的东西似乎都是   需要XPath 2。

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

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

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

答案 1 :(得分:1)

正如michael.hor257k给出的答案中已经指出的那样,你必须调整&字符才能拥有有效的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>

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

答案 2 :(得分:1)

这只是一个黑暗中的镜头,但如果你特意想用正则表达式来解决这个问题,你可能会使用如下内容:

$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