Я пытаюсь обнаружить URL-адрес или адрес электронной почты в строковом элементе файла xml, к которому применяется этот xslt. Это часть кода, с которой я работаю:
<xsl:template match="/contacts/contact/other-contact">
<xsl:value-of select="service"/>
<xsl:choose>
<xsl:when test="@type != ''">
<xsl:text>(</xsl:text>
<xsl:value-of select="@type"/>
<xsl:text>)</xsl:text>
</xsl:when>
</xsl:choose>
<xsl:text>: </xsl:text>
<xsl:choose>
<xsl:when test="matches(address,'(http(s?)://)?((www\.)?)(\w+\.)+.+')">
<a href="{address}"><xsl:value-of select="address"/></a>
</xsl:when>
<xsl:when test="matches(address,'[^@]+@[^\.]+\.\w+')">
<a href="mailto:{address}"><xsl:value-of select="address"/></a>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="address"/>
</xsl:otherwise>
</xsl:choose>
<br/>
</xsl:template>
В соответствии с этот ответ matches(var,regex)
должен просто работать, но это дает мне эту ошибку:
xmlXPathCompOpEval: function matches not found
XPath error : Unregistered function
xmlXPathCompiledEval: 2 objects left on the stack.
address
является элементом /contacts/contact/other-contact
matches
, вам нужно как минимум использовать XPath 2, как это делают процессоры XSLT 2. Сообщение об ошибке похоже на libxslt, который поддерживает только XSLT и XPath 1.0, и, в зависимости от конфигурации, EXSLT работает как xmlsoft.org/XSLT/EXSLT/html/libexslt-exslt.html. - person Martin Honnen   schedule 09.12.2017xsltproc
для компиляции документа. Не уверен, какая у меня версия и как ее обновить.xsltproc -V
дал мне этот вывод:Using libxml 20904, libxslt 10129 and libexslt 817 xsltproc was compiled against libxml 20904, libxslt 10129 and libexslt 817 libxslt 10129 was compiled against libxml 20904 libexslt 817 was compiled against libxml 20904
- person Maroš Beťko   schedule 09.12.2017matches
. Saxon 9 поддерживает XSLT и XPath 2, а в версии 9.8 даже XSLT 3 и XPath 3.1, он доступен в версиях для Java, .NET и C. - person Martin Honnen   schedule 09.12.2017xsltproc
, поэтому я не уверен, смогу ли я использовать что-то еще. Есть ли другой способ проверить соответствие регулярного выражения тому, к чему у меня есть доступ? - person Maroš Beťko   schedule 09.12.2017