Xml 如何从动态行获取数据

Xml 如何从动态行获取数据,xml,xslt,xpath,Xml,Xslt,Xpath,是否可以在第二个符号之后获取数据? 例如,我有以下XML: <document> <line>H;1F;ss;232</line> <line>H2;1F;sss;232e</line> <line>H;15F5;sds;232sa;23</line> <line>Hh;1Fs;scs;232ds</line> </document> H1F

是否可以在第二个符号
之后获取数据?
例如,我有以下XML:

<document>
    <line>H;1F;ss;232</line>
    <line>H2;1F;sss;232e</line>
    <line>H;15F5;sds;232sa;23</line>
    <line>Hh;1Fs;scs;232ds</line>
</document>

H1F;ss;232
H2;1F;sss;232e
H15F5;十二烷基硫酸钠;232sa;23
Hh;1Fs;scs;232ds
结果应该是:

<document>
    <line>ss</line>
    <line>sss</line>
    <line>sds</line>
    <line>scs</line>
</document>

党卫军
sss
十二烷基硫酸钠
scs

函数之前使用
子字符串,在
函数之后使用
子字符串,即:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="line">
        <xsl:copy>
            <xsl:value-of select="substring-before(substring-after(substring-after(., ';'), ';'), ';')"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

结果:

<document>
    <line>ss</line>
    <line>sss</line>
    <line>sds</line>
    <line>scs</line>
</document>

党卫军
sss
十二烷基硫酸钠
scs

I.使用FXSL的XSLT 1.0解决方案

<document>
    <line>H;1F;ss;232</line>
    <line>H2;1F;sss;232e</line>
    <line>H;15F5;sds;232sa;23</line>
    <line>Hh;1Fs;scs;232ds</line>
</document>
<document>
   <line>ss</line>
   <line>sss</line>
   <line>sds</line>
   <line>scs</line>
</document>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
     <document>
      <xsl:apply-templates/>
     </document>
 </xsl:template>

 <xsl:template match="line">
  <document>
   <xsl:value-of select="tokenize(., ';')[3]"/>
  </document>
 </xsl:template>
</xsl:stylesheet>
<document>
    <line>H;1F;ss;232</line>
    <line>H2;1F;sss;232e</line>
    <line>H;15F5;sds;232sa;23</line>
    <line>Hh;1Fs;scs;232ds</line>
</document>
<document>
      <document>ss</document>
      <document>sss</document>
      <document>sds</document>
      <document>scs</document>
</document>
这一转变:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
  exclude-result-prefixes="ext">
   <xsl:import href="strSplit-to-Words.xsl"/>
   <xsl:output indent="yes" omit-xml-declaration="yes"/>
   <xsl:strip-space elements="*"/>

    <xsl:template match="/*">
     <document>
      <xsl:apply-templates/>
     </document>
    </xsl:template>

    <xsl:template match="line">
      <xsl:variable name="vwordNodes">
        <xsl:call-template name="str-split-to-words">
          <xsl:with-param name="pStr" select="."/>
          <xsl:with-param name="pDelimiters" 
                          select="';'"/>
        </xsl:call-template>
      </xsl:variable>

      <line>
       <xsl:value-of select="ext:node-set($vwordNodes)/*[3]"/>
      </line>
    </xsl:template>
</xsl:stylesheet>
当此转换应用于提供的XML文档时

<document>
    <line>H;1F;ss;232</line>
    <line>H2;1F;sss;232e</line>
    <line>H;15F5;sds;232sa;23</line>
    <line>Hh;1Fs;scs;232ds</line>
</document>
<document>
   <line>ss</line>
   <line>sss</line>
   <line>sds</line>
   <line>scs</line>
</document>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
     <document>
      <xsl:apply-templates/>
     </document>
 </xsl:template>

 <xsl:template match="line">
  <document>
   <xsl:value-of select="tokenize(., ';')[3]"/>
  </document>
 </xsl:template>
</xsl:stylesheet>
<document>
    <line>H;1F;ss;232</line>
    <line>H2;1F;sss;232e</line>
    <line>H;15F5;sds;232sa;23</line>
    <line>Hh;1Fs;scs;232ds</line>
</document>
<document>
      <document>ss</document>
      <document>sss</document>
      <document>sds</document>
      <document>scs</document>
</document>

H1F;ss;232
H2;1F;sss;232e
H15F5;十二烷基硫酸钠;232sa;23
Hh;1Fs;scs;232ds
生成所需的正确结果

<document>
    <line>H;1F;ss;232</line>
    <line>H2;1F;sss;232e</line>
    <line>H;15F5;sds;232sa;23</line>
    <line>Hh;1Fs;scs;232ds</line>
</document>
<document>
   <line>ss</line>
   <line>sss</line>
   <line>sds</line>
   <line>scs</line>
</document>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
     <document>
      <xsl:apply-templates/>
     </document>
 </xsl:template>

 <xsl:template match="line">
  <document>
   <xsl:value-of select="tokenize(., ';')[3]"/>
  </document>
 </xsl:template>
</xsl:stylesheet>
<document>
    <line>H;1F;ss;232</line>
    <line>H2;1F;sss;232e</line>
    <line>H;15F5;sds;232sa;23</line>
    <line>Hh;1Fs;scs;232ds</line>
</document>
<document>
      <document>ss</document>
      <document>sss</document>
      <document>sds</document>
      <document>scs</document>
</document>

党卫军
sss
十二烷基硫酸钠
scs

没有函数可以找到“;”的第二个位置,以避免在“@Petras”之前和之后使用子字符串。所有XPath 1.0字符串函数:@Petras,我认为没有XSLT 1.0方法来简化此表达式,除非使用EXSLT。问得好,+1。关于两种解决方案,请参见我的答案:使用FXSL的XSLT1.0解决方案和XSLT2.0解决方案。提供了详细的解释和FXSL的链接。我的回答对您有用吗。?或者您在应用解决方案时遇到了任何问题?如果是,这些问题是什么?@Dimitre Novatchet:谢谢你的回答,这正是我需要的。因为我有大约10个符号“;”并且很难在前后使用子字符串找到它。我删除了XSLT 2.0的答案,因为在这里使用
tokenize
显然更合适。XSLT1.0也提供了很好的替代方案+1.