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


How to extract part of an attributes value using XSLT

我在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>

理想情况下,我希望能够使用regex来实现这一点,但我在StackOverflow上看到的大多数用于XSLT的regex内容似乎都需要XPath2。

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

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

有什么想法吗?

正如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>

匹配从CCD_ 5开始的每个CCD_
虽然从问题中还不清楚哪些是必须匹配的部分/如何确定必须调整的链接,但您可能可以调整此示例以满足您的要求或为您的问题提供进一步的输入。

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

不是大多数:全部。除非您的特定XSLT1.0处理器提供regex作为(特定于处理器的)扩展。

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

或者至少在理论上你可以。在实践中,nothing将不适用于给定的示例,因为它包含一个未标注大小的&字符,这在XML中是一个很大的no。

这只是蒙在鼓里,但如果您特别想用正则表达式解决这个问题,您可以使用以下方法:

$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