XSL v1 正则表达式 - 在文本中查找模式 - IBM Watson explorer WEX
XSL v1 Reg-expression - find patterns in text - IBM Watson explorer WEX
最佳
我正在尝试构建一个 XSL 脚本,它可以检索回以下字符串,[在文本中(如果它出现在该文本中)]:
我基本需要的模式是3.2.14P5879或者14.1.1Z5526
因此:Digits Dot Digits Dot Digits Letter-P_or_Z Digits
例如,如果我有文本:
项目 3.2.14P5879 存在问题,关于文档 14.1.1Z5526-ABC.docx 它说我们必须使用 "14.1.1P5526 - xyz.pdf"
的文档
那如果能有下一个结果就好了:
- <content name="test">3.2.14P5879</content>
- <content name="test">14.1.1Z5526</content>
- <content name="test">14.1.1P5526</content>
到目前为止我所做的但没有用的是检查某些位置是否与词汇表匹配。 (代码有效)但结果是错误的。它只会检查文本开头的语句。
<xsl:variable name="vUpper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
<xsl:variable name="vLower" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="vAlpha" select="concat($vUpper, $vLower)" />
<xsl:variable name="vDigits" select="'0123456789'" />
<xsl:variable name="vDot" select="'.'" />
<xsl:variable name="vProject" select="'PZ'" />
<xsl:template match="/">
<document>
<xsl:for-each select="//*[text()]">
<content name="Lengte" length="{string-length(.)}">
<xsl:value-of select="." />
</content>
<xsl:choose>
<xsl:when
test="string-length(translate(substring(., 1, 2), $vDigits, '')) = 0 and string-length(translate(substring(., 3, 1), $vDot, '')) = 0 and string-length(translate(substring(., 5, 1), $vDot, '')) = 0 and string-length(translate(substring(., 6, 2), $vDigits, '')) = 0 and string-length(translate(substring(., 8, 1), $vProject, '')) = 0 and string-length(translate(substring(., 9, 4), $vDigits, '')) = 0"
>
<content name="A" Proj-name="{.}" Proj="{substring(., 1, 11)}">
<xsl:value-of select="substring(., 1, 2)" />
</content>
<content name="B" Proj-name="{.}" Proj="{substring(., 1, 11)}">
<xsl:value-of select="substring(., 4, 1)" />
</content>
<content name="C" Proj-name="{.}" Proj="{substring(., 1, 11)}">
<xsl:value-of select="substring(., 6, 2)" />
</content>
<content name="D" Proj-name="{.}" Proj="{substring(., 1, 11)}">
<xsl:value-of select="substring(., 9, 4)" />
</content>
<content name="E" Proj-name="{.}" Proj="{substring(., 1, 11)}">
<xsl:value-of select="substring(., 1, 7)" />
</content>
<content name="F" Proj-name="{.}" Proj="{substring(., 1, 10)}">
<xsl:value-of select="." />
</content>
</xsl:when>
<xsl:when
test="string-length(translate(substring(., 1, 1), $vDigits, '')) = 0 and string-length(translate(substring(., 2, 1), $vDot, '')) = 0 and string-length(translate(substring(., 4, 1), $vDot, '')) = 0 and string-length(translate(substring(., 5, 2), $vDigits, '')) = 0 and string-length(translate(substring(., 7, 1), $vProject, '')) = 0 and string-length(translate(substring(., 8, 4), $vDigits, '')) = 0"
>
<content name="A" Proj-name="{.}" Proj="{substring(., 1, 10)}">
<xsl:value-of select="substring(., 1, 1)" />
</content>
<content name="B" Proj-name="{.}" Proj="{substring(., 1, 10)}">
<xsl:value-of select="substring(., 3, 1)" />
</content>
<content name="C" Proj-name="{.}" Proj="{substring(., 1, 10)}">
<xsl:value-of select="substring(., 5, 2)" />
</content>
<content name="D" Proj-name="{.}" Proj="{substring(., 1, 10)}">
<xsl:value-of select="substring(., 2, 4)" />
</content>
<content name="E" Proj-name="{.}" Proj="{substring(., 1, 10)}">
<xsl:value-of select="substring(., 1, 7)" />
</content>
<content name="F" Proj-name="{.}" Proj="{substring(., 1, 10)}">
<xsl:value-of select="." />
</content>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</document>
</xsl:template>
为什么我需要这个?为什么 XSL 版本 1.0 ???
此时此刻,我正在使用 Watson Explorer 11.0.2,我必须检索自定义元数据,我可以通过 html-xsl Action (custom-converter)(Regex - regex-text perl-regex perl-regex-text 也可用,但我什至不知道如何使用它们(感谢 IBM 提供的完美文档))
因此为了简短起见,除非有人可以帮助我在 watson explorer - custom converter - action 中通过 Regex 检索 "codes"(我知道 reg -表达式) -
我需要一些帮助才能通过 XSL 1.0 版从文本中取回代码
(PS, Watson explorer 是一个企业搜索,web scraper/crawler)
这是一个使用 EXSLT regex extension functions 的示例(在 libxslt
中实现)。我怀疑作为 Watson Explorer 一部分的正则表达式扩展函数具有相同的行为。
XML
<root>
<item>There was an issue with project 1.2.34P5678, regarding to document 23.4.5Z6789-ABC.docx it says that we've to use the documents of "35.66.78P999 - xyz.pdf"</item>
</root>
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:regexp="http://exslt.org/regular-expressions"
extension-element-prefixes="regexp">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/root">
<output>
<xsl:for-each select="item">
<xsl:call-template name="extract-matches">
<xsl:with-param name="text" select="."/>
</xsl:call-template>
</xsl:for-each>
</output>
</xsl:template>
<xsl:template name="extract-matches">
<xsl:param name="text"/>
<xsl:param name="regex" select="'\d+\.\d+\.\d+[PZ]\d+'"/>
<xsl:if test="regexp:test($text, $regex)">
<xsl:variable name="matching-substring" select="regexp:match($text, $regex)" />
<match>
<xsl:value-of select="$matching-substring" />
</match>
<!-- recursive call -->
<xsl:call-template name="extract-matches">
<xsl:with-param name="text" select="substring-after($text, $matching-substring)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
结果
<?xml version="1.0" encoding="UTF-8"?>
<output>
<match>1.2.34P5678</match>
<match>23.4.5Z6789</match>
<match>35.66.78P999</match>
</output>
最佳
我正在尝试构建一个 XSL 脚本,它可以检索回以下字符串,[在文本中(如果它出现在该文本中)]:
我基本需要的模式是3.2.14P5879或者14.1.1Z5526
因此:Digits Dot Digits Dot Digits Letter-P_or_Z Digits
例如,如果我有文本:
项目 3.2.14P5879 存在问题,关于文档 14.1.1Z5526-ABC.docx 它说我们必须使用 "14.1.1P5526 - xyz.pdf"
的文档那如果能有下一个结果就好了:
- <content name="test">3.2.14P5879</content>
- <content name="test">14.1.1Z5526</content>
- <content name="test">14.1.1P5526</content>
到目前为止我所做的但没有用的是检查某些位置是否与词汇表匹配。 (代码有效)但结果是错误的。它只会检查文本开头的语句。
<xsl:variable name="vUpper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
<xsl:variable name="vLower" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="vAlpha" select="concat($vUpper, $vLower)" />
<xsl:variable name="vDigits" select="'0123456789'" />
<xsl:variable name="vDot" select="'.'" />
<xsl:variable name="vProject" select="'PZ'" />
<xsl:template match="/">
<document>
<xsl:for-each select="//*[text()]">
<content name="Lengte" length="{string-length(.)}">
<xsl:value-of select="." />
</content>
<xsl:choose>
<xsl:when
test="string-length(translate(substring(., 1, 2), $vDigits, '')) = 0 and string-length(translate(substring(., 3, 1), $vDot, '')) = 0 and string-length(translate(substring(., 5, 1), $vDot, '')) = 0 and string-length(translate(substring(., 6, 2), $vDigits, '')) = 0 and string-length(translate(substring(., 8, 1), $vProject, '')) = 0 and string-length(translate(substring(., 9, 4), $vDigits, '')) = 0"
>
<content name="A" Proj-name="{.}" Proj="{substring(., 1, 11)}">
<xsl:value-of select="substring(., 1, 2)" />
</content>
<content name="B" Proj-name="{.}" Proj="{substring(., 1, 11)}">
<xsl:value-of select="substring(., 4, 1)" />
</content>
<content name="C" Proj-name="{.}" Proj="{substring(., 1, 11)}">
<xsl:value-of select="substring(., 6, 2)" />
</content>
<content name="D" Proj-name="{.}" Proj="{substring(., 1, 11)}">
<xsl:value-of select="substring(., 9, 4)" />
</content>
<content name="E" Proj-name="{.}" Proj="{substring(., 1, 11)}">
<xsl:value-of select="substring(., 1, 7)" />
</content>
<content name="F" Proj-name="{.}" Proj="{substring(., 1, 10)}">
<xsl:value-of select="." />
</content>
</xsl:when>
<xsl:when
test="string-length(translate(substring(., 1, 1), $vDigits, '')) = 0 and string-length(translate(substring(., 2, 1), $vDot, '')) = 0 and string-length(translate(substring(., 4, 1), $vDot, '')) = 0 and string-length(translate(substring(., 5, 2), $vDigits, '')) = 0 and string-length(translate(substring(., 7, 1), $vProject, '')) = 0 and string-length(translate(substring(., 8, 4), $vDigits, '')) = 0"
>
<content name="A" Proj-name="{.}" Proj="{substring(., 1, 10)}">
<xsl:value-of select="substring(., 1, 1)" />
</content>
<content name="B" Proj-name="{.}" Proj="{substring(., 1, 10)}">
<xsl:value-of select="substring(., 3, 1)" />
</content>
<content name="C" Proj-name="{.}" Proj="{substring(., 1, 10)}">
<xsl:value-of select="substring(., 5, 2)" />
</content>
<content name="D" Proj-name="{.}" Proj="{substring(., 1, 10)}">
<xsl:value-of select="substring(., 2, 4)" />
</content>
<content name="E" Proj-name="{.}" Proj="{substring(., 1, 10)}">
<xsl:value-of select="substring(., 1, 7)" />
</content>
<content name="F" Proj-name="{.}" Proj="{substring(., 1, 10)}">
<xsl:value-of select="." />
</content>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</document>
</xsl:template>
为什么我需要这个?为什么 XSL 版本 1.0 ??? 此时此刻,我正在使用 Watson Explorer 11.0.2,我必须检索自定义元数据,我可以通过 html-xsl Action (custom-converter)(Regex - regex-text perl-regex perl-regex-text 也可用,但我什至不知道如何使用它们(感谢 IBM 提供的完美文档))
因此为了简短起见,除非有人可以帮助我在 watson explorer - custom converter - action 中通过 Regex 检索 "codes"(我知道 reg -表达式) -
我需要一些帮助才能通过 XSL 1.0 版从文本中取回代码
(PS, Watson explorer 是一个企业搜索,web scraper/crawler)
这是一个使用 EXSLT regex extension functions 的示例(在 libxslt
中实现)。我怀疑作为 Watson Explorer 一部分的正则表达式扩展函数具有相同的行为。
XML
<root>
<item>There was an issue with project 1.2.34P5678, regarding to document 23.4.5Z6789-ABC.docx it says that we've to use the documents of "35.66.78P999 - xyz.pdf"</item>
</root>
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:regexp="http://exslt.org/regular-expressions"
extension-element-prefixes="regexp">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/root">
<output>
<xsl:for-each select="item">
<xsl:call-template name="extract-matches">
<xsl:with-param name="text" select="."/>
</xsl:call-template>
</xsl:for-each>
</output>
</xsl:template>
<xsl:template name="extract-matches">
<xsl:param name="text"/>
<xsl:param name="regex" select="'\d+\.\d+\.\d+[PZ]\d+'"/>
<xsl:if test="regexp:test($text, $regex)">
<xsl:variable name="matching-substring" select="regexp:match($text, $regex)" />
<match>
<xsl:value-of select="$matching-substring" />
</match>
<!-- recursive call -->
<xsl:call-template name="extract-matches">
<xsl:with-param name="text" select="substring-after($text, $matching-substring)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
结果
<?xml version="1.0" encoding="UTF-8"?>
<output>
<match>1.2.34P5678</match>
<match>23.4.5Z6789</match>
<match>35.66.78P999</match>
</output>