0

2 つの主なケースを持つ csv ファイルがあります

ケース #1:

「姓、名、ID#」

ケース#2

「組織名、ID#」

キャリッジ リターンごとにファイルをドキュメント ノードに分割するトークン化関数を実行しています。

<xsl:template match="/">
  <!-- tokenize on line endings -->
    <xsl:for-each select="str:tokenize(.,'&#13;&#10;')">
      <document>
        <xsl:apply-templates select="." mode="new-document" />
      </document>
    </xsl:for-each>
</xsl:template>

だから私はこれを持っています:

<document>"Don Jackson,,19001"</document>
<document>"Frederick Guitars,,ed55555,,,O"</document>
<document>"Frederick Guitars,,ed11111,,,O"</document>
<document>"A WILLIAMS,JONES THOMPSON,141212"</document>
<document>"A RANJI,ALENA,741152"</document>

ここで、ドキュメント ノード内にコンテンツ ノードを作成する必要がありますが、コンテンツ ノードの名前はドキュメント ノードの構造によって異なります。基本的に、最初のコンマの後のテキストが null の場合 (「,,」を取得することを意味します)、最初のコンテンツ ノードの名前は「Organization」になります。それ以外の場合、最初のコンテンツ ノードは「surname」と呼ばれ、2 番目のコンテンツ ノードの名前は「givenName」になります。関係なく、3 番目のノードは ID_num になります。

ここでは xsl:choose が機能するはずですが、実装方法がわかりません。誰かアドバイスをいただけますか?

ありがとう

4

1 に答える 1

0

私は模倣しましたが、データを取得した後、組織と個人の区別に関して質問しているテストの実行方法を以下に示します. テストデータが姓と名を正しく表示していないように見えることに注意してください。

t:\ftemp>type rally.xml 
<all>
<document>"Don Jackson,,19001"</document>
<document>"Frederick Guitars,,ed55555,,,O"</document>
<document>"Frederick Guitars,,ed11111,,,O"</document>
<document>"A WILLIAMS,JONES THOMPSON,141212"</document>
<document>"A RANJI,ALENA,741152"</document>
</all>
t:\ftemp>call xslt2 rally.xml rally.xsl 
<?xml version="1.0" encoding="UTF-8"?>
<document>
   <Organization>Don Jackson</Organization>
   <ID_num>19001</ID_num>
</document>
<document>
   <Organization>Frederick Guitars</Organization>
   <ID_num>ed55555</ID_num>
</document>
<document>
   <Organization>Frederick Guitars</Organization>
   <ID_num>ed11111</ID_num>
</document>
<document>
   <surname>A WILLIAMS</surname>
   <givenName>JONES THOMPSON</givenName>
   <ID_num>141212</ID_num>
</document>
<document>
   <surname>A RANJI</surname>
   <givenName>ALENA</givenName>
   <ID_num>741152</ID_num>
</document>

t:\ftemp>type rally.xsl 
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                exclude-result-prefixes="xsd"
                version="2.0">

<xsl:output indent="yes"/>

<xsl:template match="/">
  <xsl:for-each select="all/document/string(.)">
      <document>
        <!--old: <xsl:apply-templates select="." mode="new-document" /> -->
        <!--new:-->
        <xsl:variable name="parts" as="xsd:string*"
              select="tokenize(replace(.,'^&#x22;(.*)&#x22;$','$1'),',')"/>
        <xsl:choose>
          <xsl:when test="$parts[2]=''">
            <Organization><xsl:value-of select="$parts[1]"/></Organization>
            <ID_num><xsl:value-of select="$parts[3]"/></ID_num>
          </xsl:when>
          <xsl:otherwise>
            <surname><xsl:value-of select="$parts[1]"/></surname>
            <givenName><xsl:value-of select="$parts[2]"/></givenName>
            <ID_num><xsl:value-of select="$parts[3]"/></ID_num>
          </xsl:otherwise>
        </xsl:choose>
      </document>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

t:\ftemp>rem Done! 

ID 番号要素を含めるように編集されました。

于 2013-09-18T22:39:19.560 に答える