首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSL v1 Reg-表达式-在文本中查找模式- IBM资源管理器WEX

XSL v1 Reg-表达式-在文本中查找模式- IBM资源管理器WEX
EN

Stack Overflow用户
提问于 2017-03-13 14:51:54
回答 1查看 229关注 0票数 0

最好的

我正在尝试构建一个XSL脚本,它可以在文本中(如果发生在文本中)检索以下字符串

我基本上需要的模式是3.2.14P587914.1.1Z5526

因此:数字点数字点数字字母-P_或_Z位数

例如,如果我有文本:

关于文件14.1.1Z5526-ABC.docx,项目3.2.14P5879有一个问题,它说我们必须使用"__14.1.1P5526 -xyz.pdf的文档“

如果我能有下一个结果,那就太棒了:

代码语言:javascript
复制
 - <content name="test">3.2.14P5879</content> 
 - <content name="test">14.1.1Z5526</content>
 - <content name="test">14.1.1P5526</content>

到目前为止,我所做的和不起作用的是,检查一些职位是否符合词汇表。(代码起作用)但是结果是错误的。它只会检查文本开头的语句。

代码语言:javascript
复制
<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?此时,我正在使用沃森资源管理器11.0.2,并检索自定义元数据,我可以通过html-xsl Action (自定义转换器)访问这些数据(regex- regex-text perl-regex-text也可用,但我甚至不知道如何使用它们(感谢IBM提供了完美的文档)。

因此,为了保持简短,除非有人可以帮助我检索“代码”通过Regex在沃森资源管理器自定义转换器-动作(我知道reg-表达式)-

我需要一些帮助才能通过XSL版本1.0从文本中检索代码

(PS,Watson资源管理器是一个企业搜索,网络刮刀/爬虫)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-14 01:09:37

下面是一个使用EXSLT正则表达式扩展函数的示例(在libxslt中实现)。我怀疑作为Watson Explorer一部分的regex扩展函数具有相同的行为。

XML

代码语言:javascript
复制
<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>

XSLT1.0

代码语言:javascript
复制
<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>

结果

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<output>
  <match>1.2.34P5678</match>
  <match>23.4.5Z6789</match>
  <match>35.66.78P999</match>
</output>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42766625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档