2017-10-28 5 views
0

주어진 XML 요소 값을 토큰을 기반으로 여러 자식 요소로 분할 할 수있는 가이드가 있습니까? 여기 내 샘플 입력 XML 및 원하는 출력입니다. 나는 xsl 1.0을 사용하는 데 한계가있다. 고맙습니다.XSL 1.0을 사용하여 문자열을 새 요소로 분할

입력 XML :

<?xml version='1.0' encoding='UTF-8'?> 
<SQLResults> 
    <SQLResult> 
     <ACTION1>Action1</ACTION1> 
     <ACTION2>Action2</ACTION2> 
     <Encrypt>Program=GPG;Code=23FCS;</Encrypt> 
     <SENDER>Program=WebPost;Protocol=WS;Path=/home/Inbound</SENDER> 
    </SQLResult> 
</SQLResults> 

출력 XML : XSLT 2에서

<?xml version='1.0' encoding='UTF-8'?> 
<SQLResults> 
    <SQLResult> 
     <ACTION1>Action1</ACTION1> 
     <ACTION2>Action2</ACTION2> 
     <Encrypt> 
      <Program>GPG</Program> 
      <Code>23FCS</Code> 
     </Encrypt> 
     <SENDER> 
      <Program>Action4</Program> 
      <Protocol>WS</Protocol> 
      <Path>/home/Inbound</Path> 
     </SENDER> 
    </SQLResult> 
</SQLResults> 
+0

음, 먼저 확인하여 XSLT 1.0 프로세서는 http://exslt.org/str/functions/tokenize/index.html을하지 않을 경우 지원하지 않습니다 여부 , 여전히 XSLT 1.0 템플릿 기반 구현 http://exslt.org/str/functions/tokenize/str.tokenize.template.xsl을 사용할 수 있습니다. –

+0

고맙습니다. 나는 그것을 확인하고있다. 위의 기능을 가진 스 니펫을 가르쳐 주시면 감사하겠습니다. – GSR

답변

1

은 그냥 다음 템플릿으로, 쉬운 것입니다 :

<xsl:template match="Encrypt|SENDER"> 
    <xsl:copy> 
    <xsl:analyze-string select="." regex="(\w+)=([\w/]+);?"> 
     <xsl:matching-substring> 
     <element name="{regex-group(1)}"> 
      <xsl:value-of select="regex-group(2)"/> 
     </element> 
     </xsl:matching-substring> 
    </xsl:analyze-string> 
    </xsl:copy> 
</xsl:template> 

당신 때문에 w 개미 XSLT 1에서 그것을 할, 당신은 다른 방법으로 표현해야합니다. 대신 analyze-string

는, 당신은에 :

  • 토큰 화 ; 문자 사이에 포함 비어 있지 않은 토큰으로 내용. tokenize 템플릿을 추가해야합니다.
  • 각 토큰은 = char 전후의 두 부분 문자열로 나뉩니다.
  • 첫 번째 하위 문자열과 동일한 이름의 요소를 만듭니다.
  • 두 번째 부분 문자열 인이 요소의 내용을 작성하십시오.

XSLT 1 또한 tokenize 템플릿 의 결과하지 노드 기세 결과 트리 프래그먼트 (RTF)이되도록 제한을 가지며, 그러므로 그것은 는 XPath 식으로 사용될 수 없다.

이 제한을 우회하려면 exsl:node-set 기능을 사용해야합니다.

그래서 전체 스크립트는 다음과 같습니다

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exsl="http://exslt.org/common"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="Encrypt|SENDER"> 
    <xsl:copy> 
     <xsl:variable name="tokens"> 
     <xsl:call-template name="tokenize"> 
      <xsl:with-param name="txt" select="."/> 
      <xsl:with-param name="delim" select="';'"/> 
     </xsl:call-template> 
     </xsl:variable> 
     <xsl:for-each select="exsl:node-set($tokens)/token"> 
     <xsl:variable name="t1" select="substring-before(., '=')"/> 
     <xsl:variable name="t2" select="substring-after(., '=')"/> 
     <xsl:element name="{$t1}"> 
      <xsl:value-of select="$t2" /> 
     </xsl:element> 
     </xsl:for-each> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template name="tokenize"> 
    <xsl:param name="txt" /> 
    <xsl:param name="delim" select="' '" /> 
    <xsl:choose> 
     <xsl:when test="$delim and contains($txt, $delim)"> 
     <token> 
      <xsl:value-of select="substring-before($txt, $delim)" /> 
     </token> 
     <xsl:call-template name="tokenize"> 
      <xsl:with-param name="txt" select="substring-after($txt, $delim)" /> 
      <xsl:with-param name="delim" select="$delim" /> 
     </xsl:call-template> 
     </xsl:when> 
     <xsl:when test="$txt"> 
     <token><xsl:value-of select="$txt" /></token> 
     </xsl:when> 
    </xsl:choose> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy> 
    </xsl:template> 
</xsl:transform> 
+0

설명 주셔서 대단히 감사합니다. 내 일을하고있어. 다시 감사합니다. – GSR

관련 문제