Xml 如何根据字符串的内容设置XSL节点?

Xml 如何根据字符串的内容设置XSL节点?,xml,xslt,Xml,Xslt,我有一个csv文件,它有两个主要案例 案例1: “姓,吉文名,身份证” 案例2 “组织名称,id#” 我正在做一个标记化函数,在每次回车时将文件分解为文档节点 <xsl:template match="/"> <!-- tokenize on line endings --> <xsl:for-each select="str:tokenize(.,'&#13;&#10;')"> <document>

我有一个csv文件,它有两个主要案例

案例1:

“姓,吉文名,身份证”

案例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>
唐杰克逊,19001年 “弗雷德里克吉他,ed55555,,,O” “弗雷德里克吉他,ed11111,,,O” A威廉姆斯,琼斯·汤普森,141212 阿兰吉,阿莱娜,741152 现在,我需要在文档节点中创建内容节点,但是内容节点的名称将取决于文档节点的结构。基本上,如果第一个逗号后的文本为null(表示您得到“,”),则第一个内容节点的名称将为“Organization”。否则,第一个内容节点将被称为“姓氏”,第二个内容节点的名称将被称为“givenName”。不管怎样,第三个节点将是ID_num

这里似乎应该使用xsl:choose,但我不确定如何实现它。有人能提供一些建议吗


谢谢

我模仿了,不过你得到了你的数据,然后我在下面向你展示了如何进行你所问的关于区分组织和个人的测试。我注意到测试数据似乎没有正确地显示姓氏和名字

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! 
t:\ftemp>键入rally.xml
唐·杰克逊,19001年
“弗雷德里克吉他,ed55555,,,O”
“弗雷德里克吉他,ed11111,,,O”
A威廉姆斯,琼斯·汤普森,141212
阿兰吉,阿莱娜,741152
t:\ftemp>调用xslt2 rally.xml rally.xsl
唐·杰克逊
19001
弗雷德里克吉他
ed55555
弗雷德里克吉他
ed11111
威廉姆斯
琼斯·汤普森
141212
阿兰吉
阿莱娜
741152
t:\ftemp>键入rally.xsl
t:\ftemp>rem完成!

编辑后包含id number元素。

顺便说一句,str:tokenize函数实际上是使用相同功能的特定于应用程序的函数。我不确定'str:tokenize'的格式是否正确,我只是更改了应用程序使用的函数的名称。嗨,肯,谢谢你的回答。我实际上正在上你的课程(需要在这方面取得一些进展!),所以看到你回答这个问题很有趣。你能解释一下这条线的作用吗?ThanksIt正在从双引号中提取字符串。然后它用逗号标记它。