如何使用 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>
...
我需要能够提取 href
的 a/b/c/d
部分并将 link 转换为类似的内容:
<a href="/lookup?id=a/b/c/d">Link Content</a>
理想情况下,我希望能够使用正则表达式执行此操作,但我在 Whosebug 上看到的大多数 XSLT 正则表达式内容似乎都需要 XPath 2。
啊是的...我在 PHP5.3 上使用 SimpleXML/DomDocument 来应用我 认为 不支持 v2 xslt 的样式表.
我想我可以进行字符串替换以丢失第一部分,但我想要一个模式匹配来提取它。
有什么想法吗?
most of the regex stuff I've seen for XSLT on Whosebug seems to
require XPath 2.
不是最多:全部。除非您的特定 XSLT 1.0 处理器提供正则表达式作为(特定于处理器的)扩展。
现在,您的问题中缺少的部分是如何识别要从现有值中提取的部分。例如,如果它总是出现在(第一次出现的)"id=" 之后的子字符串,那么您可以使用 substring-after() 函数来检索它。
或者至少在理论上你可以。实际上,nothing 将适用于给定的示例,因为它包含一个未转义的 &
字符 - XML.
中的一个大禁忌
正如 michael.hor257k 给出的答案中已经指出的,您必须调整 &
字符以使其具有有效的 XML。给定包含例如
的输入
<a href="#SCRIPT_NAME#?a=b&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>
将 link 更改为
<a href="/lookup?id=a/b/c/d">Link Content</a>
匹配以 #SCRIPT_NAME#
开头的每个 href
。
虽然从问题中不清楚哪个部分必须匹配/如何识别必须调整的 links,但您可以调整此示例以满足您的要求或为您的问题提供进一步的输入.
这只是瞎猜,但如果您特别希望使用正则表达式解决此问题,您可以使用如下内容:
$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);
我在 HTML 文件(或类似文件)中有以下代码行:
...
<a href="#SCRIPT_NAME#?a=b&id=a/b/c/d">Link Content</a>
...
我需要能够提取 href
的 a/b/c/d
部分并将 link 转换为类似的内容:
<a href="/lookup?id=a/b/c/d">Link Content</a>
理想情况下,我希望能够使用正则表达式执行此操作,但我在 Whosebug 上看到的大多数 XSLT 正则表达式内容似乎都需要 XPath 2。
啊是的...我在 PHP5.3 上使用 SimpleXML/DomDocument 来应用我 认为 不支持 v2 xslt 的样式表.
我想我可以进行字符串替换以丢失第一部分,但我想要一个模式匹配来提取它。
有什么想法吗?
most of the regex stuff I've seen for XSLT on Whosebug seems to require XPath 2.
不是最多:全部。除非您的特定 XSLT 1.0 处理器提供正则表达式作为(特定于处理器的)扩展。
现在,您的问题中缺少的部分是如何识别要从现有值中提取的部分。例如,如果它总是出现在(第一次出现的)"id=" 之后的子字符串,那么您可以使用 substring-after() 函数来检索它。
或者至少在理论上你可以。实际上,nothing 将适用于给定的示例,因为它包含一个未转义的 &
字符 - XML.
正如 michael.hor257k 给出的答案中已经指出的,您必须调整 &
字符以使其具有有效的 XML。给定包含例如
<a href="#SCRIPT_NAME#?a=b&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>
将 link 更改为
<a href="/lookup?id=a/b/c/d">Link Content</a>
匹配以 #SCRIPT_NAME#
开头的每个 href
。
虽然从问题中不清楚哪个部分必须匹配/如何识别必须调整的 links,但您可以调整此示例以满足您的要求或为您的问题提供进一步的输入.
这只是瞎猜,但如果您特别希望使用正则表达式解决此问题,您可以使用如下内容:
$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);