2017-03-13 3 views
0

최저XSL v1을 등록 표현은 - 텍스트의 패턴을 찾아 - IBM 왓슨 탐색기 WEX를

내가 그 발생하면 (텍스트 다시 다음 문자열을 검색 할 수있는 XSL 스크립트를 [구축하기 위해 노력하고있어 텍스트)] :

나는 기본적으로 3.2.14P5879 또는 따라서 14.1.1Z5526

입니다 필요로하는 패턴 :

자리 자리 도트 자리 도트 자리 레터 P_or_Z 나는 텍스트를 한 경우, 예를 들어

는 : 14.1.1Z5526을 문서화에 대한 프로젝트 3.2.14P5879에 문제가 있었다

은 우리가를 사용했습니다 있다고 -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> 
012,317을

내가 지금까지 해왔고 작동하지 않는 것은 일부 위치가 어휘와 일치하는지 확인하는 것입니다. (코드 작동) 그러나 결과는 잘못되었습니다. 텍스트 시작 부분의 진술 만 검사합니다.

<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="''" /> 
<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 액션 (사용자 지정 변환기)을 통해 액세스 할 수있는 사용자 지정 메타 데이터를 검색했습니다 (Regex-regex-text perl-regex perl-regex-text도 사용할 수 있지만 사용 방법에 대한 단서가 하나도 없습니다. (완벽한 문서를 작성해 주셔서 감사합니다.)

따라서 짧게 유지하기 위해 왓슨 탐색기에서 정규식을 통해 "코드"를 검색 - 사용자 정의 변환기 - 액션를 (필자는 등록 표현을 알고) -

내가 XSL 버전을 통해 다시 텍스트에서 코드를 검색하기 위해 도움이 있어야 1.0

(PS, Watson 탐색기는 엔터프라이즈 검색, 웹 스크래퍼/크롤러입니다.)

+0

AFAIK는 왓슨 탐색기 확장 기능 포함의 다양한 지원합니다. 정규식. 나는'viv : match()'함수가 당신이 원하는 함수라고 믿지만, 나는 Watson 사용자가 아니기 때문에 이것을 테스트 할 수 없다. pure XSLT 1.0에서 정규 표현식 지원없이이 작업을 수행하는 것은 매우 어려울 것입니다. 각 자릿수에 얼마나 많은 자릿수가 있는지 알 수 있습니까? –

+0

@ michael.hor257k - 길이가 가변적 인 이유는 일부 숫자가 프로젝트 ID를 나타 내기 때문입니다. 따라서 그것은 다를 수 있습니다. 정규 표현식의 주된 문제는 시작하는 방법을 모르는 것입니다. html-xsl을 사용할 때, ** ** 후에 ** 일부 요소를 정의 할 수 있음을 알았습니다. 하지만 Regex에는 해당 작업 기능에 대한 적절한 문서가 하나도 없습니다. 또한 예제가 없습니다. (나는 오히려 정규식을 사용하는 것을 좋아할 것이지만 ... 당신이 그것을 어떻게 사용할 수 있는지 알고 싶습니다.) – Dieter

+0

http://exslt.org/regexp/functions/match/index와 똑같이 동작합니다. htaccess Admin Home English Language Content –

답변

1

다음은 (libxslt에서 구현 됨)을 사용하는 예입니다. 왓슨 익스플로러의 일부인 정규식 확장 함수가 같은 동작을하는 것으로 의심됩니다.

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> 
+0

아직 작동하지 않는다면, 나는 그것을 아주 빨리 시도했지만 regexp와의 호출이 정확하지 않다고 생각한다. 나는 그것을 보았다. :) 그러나 당신의 조언을 신뢰한다. XD – Dieter

+1

노트 대신'viv' 네임 스페이스에서 Watson의 확장 함수를 사용해야합니다. 그 문서는 아주 분명합니다. –

+0

안녕하세요, viv로 이름을 바꾸면 작동하는 것처럼 보입니다. 하지만 regex에는 문제가 있습니다. 정규 표현식 0.12 (https://www.ibm.com/support/knowledgecenter/SS8NLW_9.0.0/com.ibm.swg.im.infosphere.dataexpl.engine.man.doc/r_viv_match)를 사용합니다. .html & 정규식 사양) - 그 경험은 있습니까? :) – Dieter