Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何使用显式交叉引用对元素值进行分组?_Xml_Xslt - Fatal编程技术网

Xml 如何使用显式交叉引用对元素值进行分组?

Xml 如何使用显式交叉引用对元素值进行分组?,xml,xslt,Xml,Xslt,如何使用@corresp属性创建的显式交叉引用对XML源中元素的值进行分组 <DIV> <div id="fr"> <seg id="fr_1" corresp="#en_1">abc</seg> <seg id="fr_2" corresp="#en_2 #en3">def</seg> <seg id="fr_3" corresp="#en_3 #en_4">ghi</seg> &l

如何使用@corresp属性创建的显式交叉引用对XML源中元素的值进行分组

<DIV>
<div id="fr">
  <seg id="fr_1" corresp="#en_1">abc</seg>
  <seg id="fr_2" corresp="#en_2 #en3">def</seg>
  <seg id="fr_3" corresp="#en_3 #en_4">ghi</seg>
  <seg id="fr_4" corresp="#en_4 #en_5">jkl</seg>
  <seg id="fr_5" corresp="#en_6">mno</seg>
</div>
<div id="en">
  <seg id="en_1" corresp="#fr_1">ab</seg>
  <seg id="en_2" corresp="#fr_1 #fr_2">cde</seg>
  <seg id="en_3" corresp="#fr_2 #fr_3">fg</seg>
  <seg id="en_4" corresp="#fr_3 #fr_4">hij</seg>
  <seg id="en_5" corresp="#fr_4">kl</seg>
  <seg id="en_6" corresp="#fr_5">mno</seg>
</div>
</DIV>

abc
def
ghi
jkl
mno
ab
cde
前景
你好
吉隆坡
mno
XSLT转换的输出应如下所示:

<div>
  <ul>
    <li>abc<br/>ab</li>
    <li>abc<br/>cde</li>
    <li>def<br/>cde</li>
    <li>def<br/>fg</li>
    <li>ghi<br/>fg</li>
    <li>ghi<br/>hij</li>
    <li>jkl<br/>hij</li>
    <li>jkl<br/>kl</li>
    <li>mno<br/>mno</li>
 </ul>
</div>
<DIV>
<div id="fr">
  <seg id="fr_1"><w id="fr1" corresp="#en2">AA</w> <w id="fr2" corresp="#en3">BB</w>, <w id="fr3" corresp="#en1">CC</w>.</seg>
  <seg id="fr_2"><w id="fr1" corresp="#en1">DD</w> <w id="fr2" corresp="#en3">EE</w>?</seg>
  <seg id="fr_3"><w id="fr1" corresp="#en1">FF</w> <w id="fr2" corresp="#en3">GG</w><w id="fr3" corresp="#en2">HH</w></seg>
</div>
<div id="en">
<seg id="en_1"><w id="en1" corresp="#fr3">AX</w><w id="en2" corresp="#fr1">BX</w><w id="en3" corresp="#fr2">CX</w></seg>
 <seg id="en_2"><w id="en1" corresp="#fr1">DX</w><w id="en2" corresp="#en0">EX</w><w id="en3" corresp="#en2">FX</w></seg> 
 <seg id="en_3"><w id="en1" corresp="#fr1">HX</w> <w id="en2" corresp="#en3">IX</w><w id="en3" corresp="#en2">JX</w>.</seg>
</div>
<div>
 <ol>
  <li><w>AA</w> : <w>BX</w><br/><w>BB</w> : <w>AX</w><br/> </li>
  <li><w>DD</w> : <w>DX</w><w>EE</w> : <w>FX</w><br/><br/> </li>
  <li><w>FF</w> :<w>HX</w><br/> <w>GG</w> :<w>JX</w><br/><w>HH</w>:<w>IX</w><br/></li>
 </ol>
</div>

  • abc
    ab
  • abc
    cde
  • def
    cde
  • def
    fg
  • ghi
    fg
  • ghi
    hij
  • jkl
    hij
  • jkl
    kl
  • mno
    mno
谢谢

@Jirka,这里是一个类似的输入,但是在元素中嵌套了更多的元素。corresp属性定义了这些新元素之间的交叉引用。修改后的输入如下所示:

<div>
  <ul>
    <li>abc<br/>ab</li>
    <li>abc<br/>cde</li>
    <li>def<br/>cde</li>
    <li>def<br/>fg</li>
    <li>ghi<br/>fg</li>
    <li>ghi<br/>hij</li>
    <li>jkl<br/>hij</li>
    <li>jkl<br/>kl</li>
    <li>mno<br/>mno</li>
 </ul>
</div>
<DIV>
<div id="fr">
  <seg id="fr_1"><w id="fr1" corresp="#en2">AA</w> <w id="fr2" corresp="#en3">BB</w>, <w id="fr3" corresp="#en1">CC</w>.</seg>
  <seg id="fr_2"><w id="fr1" corresp="#en1">DD</w> <w id="fr2" corresp="#en3">EE</w>?</seg>
  <seg id="fr_3"><w id="fr1" corresp="#en1">FF</w> <w id="fr2" corresp="#en3">GG</w><w id="fr3" corresp="#en2">HH</w></seg>
</div>
<div id="en">
<seg id="en_1"><w id="en1" corresp="#fr3">AX</w><w id="en2" corresp="#fr1">BX</w><w id="en3" corresp="#fr2">CX</w></seg>
 <seg id="en_2"><w id="en1" corresp="#fr1">DX</w><w id="en2" corresp="#en0">EX</w><w id="en3" corresp="#en2">FX</w></seg> 
 <seg id="en_3"><w id="en1" corresp="#fr1">HX</w> <w id="en2" corresp="#en3">IX</w><w id="en3" corresp="#en2">JX</w>.</seg>
</div>
<div>
 <ol>
  <li><w>AA</w> : <w>BX</w><br/><w>BB</w> : <w>AX</w><br/> </li>
  <li><w>DD</w> : <w>DX</w><w>EE</w> : <w>FX</w><br/><br/> </li>
  <li><w>FF</w> :<w>HX</w><br/> <w>GG</w> :<w>JX</w><br/><w>HH</w>:<w>IX</w><br/></li>
 </ol>
</div>

AA-BB,CC。
迪迪?
FF GGHH
AXBXCX
DXEXFX
HX-IXJX。

所需的输出应如下所示:

<div>
  <ul>
    <li>abc<br/>ab</li>
    <li>abc<br/>cde</li>
    <li>def<br/>cde</li>
    <li>def<br/>fg</li>
    <li>ghi<br/>fg</li>
    <li>ghi<br/>hij</li>
    <li>jkl<br/>hij</li>
    <li>jkl<br/>kl</li>
    <li>mno<br/>mno</li>
 </ul>
</div>
<DIV>
<div id="fr">
  <seg id="fr_1"><w id="fr1" corresp="#en2">AA</w> <w id="fr2" corresp="#en3">BB</w>, <w id="fr3" corresp="#en1">CC</w>.</seg>
  <seg id="fr_2"><w id="fr1" corresp="#en1">DD</w> <w id="fr2" corresp="#en3">EE</w>?</seg>
  <seg id="fr_3"><w id="fr1" corresp="#en1">FF</w> <w id="fr2" corresp="#en3">GG</w><w id="fr3" corresp="#en2">HH</w></seg>
</div>
<div id="en">
<seg id="en_1"><w id="en1" corresp="#fr3">AX</w><w id="en2" corresp="#fr1">BX</w><w id="en3" corresp="#fr2">CX</w></seg>
 <seg id="en_2"><w id="en1" corresp="#fr1">DX</w><w id="en2" corresp="#en0">EX</w><w id="en3" corresp="#en2">FX</w></seg> 
 <seg id="en_3"><w id="en1" corresp="#fr1">HX</w> <w id="en2" corresp="#en3">IX</w><w id="en3" corresp="#en2">JX</w>.</seg>
</div>
<div>
 <ol>
  <li><w>AA</w> : <w>BX</w><br/><w>BB</w> : <w>AX</w><br/> </li>
  <li><w>DD</w> : <w>DX</w><w>EE</w> : <w>FX</w><br/><br/> </li>
  <li><w>FF</w> :<w>HX</w><br/> <w>GG</w> :<w>JX</w><br/><w>HH</w>:<w>IX</w><br/></li>
 </ol>
</div>

  • AA:BX
    BB:AX
  • DD:DXEE:FX

  • FF:HX
    GG:JX
    HH:IX

  • 您可以尝试对上一个问题稍加修改:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" indent="yes"/>
        <xsl:key name="kSegId" match="seg" use="@id"/>
    
        <xsl:template match="/DIV">
            <html>
                <head>
                    <title></title>
                </head>
                <body>
                    <ul>
                        <xsl:apply-templates select="div[@id='en']/seg"/>
                    </ul>
                </body>
            </html>
        </xsl:template>
    
        <xsl:template match="seg">
                    <xsl:call-template name="findtarget">
                        <xsl:with-param name="targets" select="@corresp" />
                    </xsl:call-template>
    
        </xsl:template>
    
        <xsl:template name="findtarget">
            <xsl:param name="targets" />
            <xsl:choose>
                <xsl:when test="contains($targets, ' ')">
                    <xsl:call-template name="findtarget">
                        <xsl:with-param name="targets" select="substring-before($targets,' ')" />
                    </xsl:call-template>
                    <xsl:call-template name="findtarget">
                        <xsl:with-param name="targets" select="substring-after($targets,' ')" />
                    </xsl:call-template>
                </xsl:when>
                <xsl:otherwise>
                    <li>
    
                        <xsl:value-of select="key('kSegId',substring-after($targets, '#'))"/>
                        <br/>
                        <xsl:value-of select="."/>
                    </li>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:template>
    
    </xsl:stylesheet>
    
    
    

  • 将生成以下输出:

    <?xml version="1.0"?>
    <html>
      <head>
        <title/>
      </head>
      <body>
        <ul>
          <li>abc<br/>ab</li>
          <li>abc<br/>cde</li>
          <li>def<br/>cde</li>
          <li>def<br/>fg</li>
          <li>ghi<br/>fg</li>
          <li>ghi<br/>hij</li>
          <li>jkl<br/>hij</li>
          <li>jkl<br/>kl</li>
          <li>mno<br/>mno</li>
        </ul>
      </body>
    </html>
    
    
    
    • abc
      ab
    • abc
      cde
    • def
      cde
    • def
      fg
    • ghi
      fg
    • ghi
      hij
    • jkl
      hij
    • jkl
      kl
    • mno
      mno

    遵循xslt可以工作

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    
        <xsl:template match="/DIV">
            <div>
                <ul>
                <xsl:apply-templates select="div[@id = 'fr']/seg" />
                </ul>
            </div>
        </xsl:template>
    
        <xsl:template match="seg[../@id = 'fr']">
            <xsl:variable name="id" select="@id" />
            <xsl:variable name="text" select="." />
    
            <xsl:for-each select="//div[@id = 'en']/seg[contains(@corresp, $id)]">
                <li>
                    <xsl:value-of select="$text" />
                    <br />
                    <xsl:value-of select="." />
                </li>
            </xsl:for-each>
        </xsl:template>
    </xsl:stylesheet>
    
    
    

  • 这将转换我的输入

    <?xml version="1.0" encoding="UTF-8"?>
    <DIV>
        <div id="fr">
            <seg id="fr_1" corresp="#en_1">abc</seg>
            <seg id="fr_2" corresp="#en_2 #en3">def</seg>
            <seg id="fr_3" corresp="#en_3 #en_4">ghi</seg>
            <seg id="fr_4" corresp="#en_4 #en_5">jkl</seg>
            <seg id="fr_5" corresp="#en_6">mno</seg>
        </div>
        <div id="en">
            <seg id="en_1" corresp="#fr_1">ab</seg>
            <seg id="en_2" corresp="#fr_1 #fr_2">cde</seg>
            <seg id="en_3" corresp="#fr_2 #fr_3">fg</seg>
            <seg id="en_4" corresp="#fr_3 #fr_4">hij</seg>
            <seg id="en_5" corresp="#fr_4">kl</seg>
            <seg id="en_6" corresp="#fr_5">mno</seg>
        </div>
    </DIV>
    
    
    abc
    def
    ghi
    jkl
    mno
    ab
    cde
    前景
    你好
    吉隆坡
    mno
    
    输入此输出

    <?xml version="1.0" encoding="UTF-8"?>
    <div xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <ul>
            <li>abc<br/>ab</li>
            <li>abc<br/>cde</li>
            <li>def<br/>cde</li>
            <li>def<br/>fg</li>
            <li>ghi<br/>fg</li>
            <li>ghi<br/>hij</li>
            <li>jkl<br/>hij</li>
            <li>jkl<br/>kl</li>
            <li>mno<br/>mno</li>
        </ul>
    </div>
    
    
    
    • abc
      ab
    • abc
      cde
    • def
      cde
    • def
      fg
    • ghi
      fg
    • ghi
      hij
    • jkl
      hij
    • jkl
      kl
    • mno
      mno

    如果您需要html输出,则必须更改xsl:output声明,并向输入中添加一些html标记。

    @hr117,我以某种方式将整个输出作为单个字符串保存在
  • 中…?感谢您的解决方案。我尝试了您的代码,它确实返回了我需要的输出,但它将所有数据作为单个字符串检索。无法锁定罪犯…奇怪。。。您的输入是否与您在问题中提出的完全相同?例如,没有其他元素吗?我在这里的输入中发现了一个错误:def,应该是def。也就是说,将#en3改为#en#u 3。但这不应该是问题…对,不应该是那个问题。我添加了一些关于输入和输出文件的更多信息。。。可能是,它们在某些方面与您的不同。是的,您是对的,我忽略了更改输出方法。它工作得非常好。谢谢!