2014-02-19 2 views
1

는이 같은 쉼표로 구분 된 태그가 포함 된 XML 문서 ... xslt를 사용하여 XML에서 쉼표로 구분 된 태그의 형식을 변경 하시겠습니까?

<?xml version="1.0" encoding="utf-8" ?> 
<pages> 
    <page> 
     <tags>AAMC 2013, Learning Health System, Cost</tags> 
    </page> 
    <page> 
     <tags>AAMC 2013, Cost, Innovation</tags> 
    </page> 
    <page> 
     <tags>AAMC 2013, Cost, Innovation</tags> 
    </page> 
</pages> 

더는 태그 이름과 수를 분리하는 경우 아래의 코드처럼 표시하기 위해 XML을 변경, XSLT를 사용하여, 그것을 가능이 얼마나 자주 태그가 참조됩니까?

<?xml version="1.0" encoding="utf-8" ?> 
<pages> 
    <page> 
     <tag> 
      <name>AAMC 2013</name> 
      <amount>3</amount> 
     </tag> 
     <tag> 
      <name>Learning Health System</name> 
      <amount>1</amount> 
     </tag> 
     <tag> 
      <name>Cost</name> 
      <amount>3</amount> 
     </tag> 
    </page> 
    <page> 
     <tag> 
      <name>AAMC 2013</name> 
      <amount>3</amount> 
     </tag> 
     <tag> 
      <name>Cost</name> 
      <amount>3</amount> 
     </tag> 
     <tag> 
      <name>Innovation</name> 
      <amount>2</amount> 
     </tag> 
    </page> 
    <page> 
     <tag> 
      <name>AAMC 2013</name> 
      <amount>3</amount> 
     </tag> 
     <tag> 
      <name>Cost</name> 
      <amount>3</amount> 
     </tag> 
     <tag> 
      <name>Innovation</name> 
      <amount>2</amount> 
     </tag> 
    </page> 
</pages> 

어떤 도움을 주셔서 감사합니다.

+0

xslt의 버전은 무엇입니까? –

+0

xslt-1.0을 사용하고 있습니다. – Jonathan

답변

0

IIUC, 여기에 두 가지 작업이 있습니다 :

  1. 토큰 화 태그는;

  2. 각 태그의 발생 횟수를 센다.

두 번째 작업은 입력으로 첫 번째의 출력을 필요 - 그래서 우리는 두 개의 패스에서이 작업을 수행해야합니다

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:exsl="http://exslt.org/common" 
extension-element-prefixes="exsl"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:key name="sametag" match="token" use="." /> 

<xsl:template match="/"> 
<!-- first pass --> 
<xsl:variable name="tagnames"> 
    <xsl:for-each select="pages/page"> 
     <page> 
      <xsl:call-template name="tokenize"> 
       <xsl:with-param name="string" select="tags" /> 
      </xsl:call-template> 
     </page> 
    </xsl:for-each> 
</xsl:variable> 
<xsl:variable name="tagnames-set" select="exsl:node-set($tagnames)" /> 
<!-- second (final) pass --> 
<pages> 
    <xsl:for-each select="$tagnames-set/page"> 
     <page> 
     <xsl:for-each select="token"> 
      <tag> 
       <name><xsl:value-of select="." /></name> 
       <amount><xsl:value-of select="count(key('sametag', .))" /></amount> 
      </tag> 
     </xsl:for-each> 
     </page> 
    </xsl:for-each> 
</pages> 
</xsl:template> 

<xsl:template name="tokenize"> 
    <xsl:param name="string"/> 
    <xsl:param name="delimiter" select="', '"/> 
    <xsl:choose> 
     <xsl:when test="contains($string, $delimiter)"> 
      <token><xsl:value-of select="substring-before($string, $delimiter)" /></token> 
      <!-- recursive call --> 
      <xsl:call-template name="tokenize"> 
       <xsl:with-param name="string" select="substring-after($string, $delimiter)" /> 
       <xsl:with-param name="delimiter" select="$delimiter" /> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <token><xsl:value-of select="$string"/></token> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 

참고이 필요로하는 EXSLT의 노드 집합() 함수는 XSLT 1.0 프로세서에서 널리 지원됩니다. 프로세서가 EXSLT tokenize() 함수를 지원하면 토큰 화 템플릿 대신 사용할 수 있습니다. 그 출력은 이미 노드 집합이므로 스타일 시트를 상당히 단순하게 만들 수 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 조금 다른 것을 시도하고 있는데 좀 더 이해하기 위해 나의 질문을 변경했다. 나는 생각한다. 미안 해요, 이젠 새로운데. – Jonathan

+0

@Jonathan 질문을 다시 편집하고 입력 및 출력 XML 문서가 모두 올바른지 확인하십시오. 지금은 둘 다 루트 요소가 없습니다. 나는 하나를 추가 하겠지만 이미 페이지 안에 페이지가 있고 나의 예가 실제 데이터에 맞지 않을까 두렵다. –

+0

죄송합니다. 페이지가 너무 많습니다. – Jonathan

관련 문제