2016-07-14 89 views
1

輸入拆分使用選擇2個或多個分號分隔的項目

  <row> 
      <name-prf>Prokofiev, Serge (piano); Adolph Bolm (dancer)</name-prf> 
      </row> 

所需的輸出

<subject> 
     <name type="personal"> 
      <namePart>Prokofiev, Serge (piano)</namePart> 
      <role> 
       <roleTerm type="code" authority="marcrelator">prf</roleTerm> 
      </role> 
     </name> 
    </subject> 

<subject> 
    <name type="personal"> 
     <namePart>Adolph Bolm (dancer)</namePart> 
     <role> 
      <roleTerm type="code" authority="marcrelator">prf</roleTerm> 
     </role> 
    </name> 
</subject> 

當前代碼

 <subject> 
      <name type="personal"> 
       <namePart> 
       <xsl:value-of select="name-prf"/> 
       </namePart> 
       <role> 
        <roleTerm type="code" authority="marcrelator">prf</roleTerm> 
       </role> 
      </name> 
     </subject> 

我一直主要使用的價值,而不是個人因爲順序與初始表單非常不同,但我確實認爲這裏的解決方案是可能的多次強制模板調用?

+0

搜索* tokenize *。這是XSLT 2.0中的一個函數 - 在XSLT 1.0中,您需要一個遞歸命名模板或一個支持它作爲擴展函數的處理器。 –

+0

我只是不太清楚如何在這種情況下使用標記化。我可以使用2.0 –

+0

例如,這不起作用:

回答

1

我只是不太知道如何在這種情況下使用令牌化。我可以用 2.0

喜歡的東西:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="row"> 
    <xsl:for-each select="tokenize(name-prf, '; ')"> 
     <subject> 
      <name type="personal"> 
       <namePart> 
        <xsl:value-of select="."/> 
       </namePart> 
       <role> 
        <roleTerm type="code" authority="marcrelator">prf</roleTerm> 
       </role> 
      </name> 
     </subject> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
+0

啊,如果我再次檢查我會看到這一點。我認爲這也適用。謝謝。 –

0

如果僅限於XSLT 1.0添加爲一個擴展功能:

public XPathNodeIterator Tokenize(string value, string separators) 
{ 
    XElement root = new XElement("Root"); 
    string[] tokens = value.Split(separators.ToCharArray()); 

    for (int i = 0; i < tokens.Length; i++) 
    { 
    root.Add(tokens[i]); 
    } 

    return root.CreateNavigator().Select("/"); 
} 
0

好吧,令牌化是關鍵,我沒能直記號化,但我可以用一個參數記號化,不知道爲什麼,後來成爲一種區別:

<xsl:param name="seperator" select="'; '"/> 

<xsl:for-each select="distinct-values(name-prf/tokenize(.,$seperator))"> 
       <person><xsl:value-of select="."/></person> 
      </xsl:for-each>