2014-02-19 204 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> 

是否有可能,使用XSLT,改變XML來顯示更多的像下面的地方分隔標籤名稱和計數碼標籤被引用多少次?

<?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