0

如何跨多个 <div> 块对元素进行分组,如果它们具有唯一的 id 和由相关属性创建的交叉引用。元素可能有相应的匹配,也可能没有。如果它们不匹配,则对应的属性包含为零的值。这种匹配的真实上下文可能发生在将翻译的单词与其在原始文本中的对应单词链接时。XML 输入示例如下所示:

<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>

如果通过相关属性遵循链接路径,输出应如下所示:

<div>
 <ol>
   <li><w>AA</w> : <w>BX</w><br/> <w>BB</w> : <w>CX</w><br/> <w>CC</w> : <w>AX</w> <br/> </li>
   <li><w>DD</w> : <w>DX</w><br/> <w>EE</w> : <w>FX</w><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>

谢谢!

4

2 回答 2

1

要查找其他元素,通常最好使用键。看起来您希望在查找相应元素时考虑seg的 id,在这种情况下,您可以像这样定义您的键:

<xsl:key name="corresp" match="w" use="concat(substring-after(../@id, '_'), '#', @id)" />

然后,假设您位于w元素上,要查找相应的值,您将使用如下键:

<xsl:value-of select="key('corresp', concat(substring-after(../@id, '_'), @corresp))" />

这是完整的 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:key name="corresp" match="w" use="concat(substring-after(../@id, '_'), '#', @id)"/>

   <xsl:template match="div[@id='fr']">
      <ol>
         <xsl:apply-templates/>
      </ol>
   </xsl:template>

   <xsl:template match="div[@id='en']"/>

   <xsl:template match="seg">
      <li>
         <xsl:apply-templates select="w"/>
      </li>
   </xsl:template>

   <xsl:template match="w">
      <w>
         <xsl:value-of select="."/>
      </w>
      <xsl:text> : </xsl:text>
      <w>
         <xsl:value-of select="key('corresp', concat(substring-after(../@id, '_'), @corresp))"/>
      </w>
      <br/>
   </xsl:template>

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

当应用于您的 XML 时,将输出以下内容

<DIV>
   <ol>
      <li>
         <w>AA</w> : <w>BX</w><br/><w>BB</w> : <w>CX</w><br/><w>CC</w> : <w>AX</w><br/>
      </li>
      <li>
         <w>DD</w> : <w>DX</w><br/><w>EE</w> : <w>FX</w><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>

您在问题中提到“如果它们不匹配,则对应的属性包含零值”,但没有给出示例。不过,您可以做的是将上述结果存储在一个变量中,然后只需使用xsl:choose来输出零。像这样的东西,也许......

 <xsl:variable name="value" 
               select="key('corresp', concat(substring-after(../@id, '_'), @corresp))"/>
 <xsl:choose>
     <xsl:when test="string-length($value) > 0"><xsl:value-of select="$value" /><xsl:when>
     <xsl:otherwise>0</xsl:otherwise>
 </xsl:choose>
于 2013-07-13T09:10:22.577 回答
0

更简单一点,你可以试试这个:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="kId" match="seg/w" use="@id"/>
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/DIV">
        <div>
            <ol>
                <xsl:apply-templates select="div[@id='fr']/seg"/>
            </ol>
        </div>
    </xsl:template>
    <xsl:template match="div/seg">
            <li>
                <xsl:for-each select="w" >
                    <w><xsl:value-of select="."/></w>
                    <xsl:text> : </xsl:text>
                    <w>
                        <xsl:value-of select="key('kId',substring-after(@corresp, '#'))"/>
                    </w>
                    <br/>
                </xsl:for-each>
            </li>
    </xsl:template>
</xsl:stylesheet>

这将产生以下输出:

<?xml version="1.0"?>
<div>
  <ol>
    <li><w>AA</w> : <w>BX</w><br/><w>BB</w> : <w>CX</w><br/><w>CC</w> : <w>AX</w><br/></li>
    <li><w>DD</w> : <w>AX</w><br/><w>EE</w> : <w>CX</w><br/></li>
    <li><w>FF</w> : <w>AX</w><br/><w>GG</w> : <w>CX</w><br/><w>HH</w> : <w>BX</w><br/></li>
  </ol>
</div>
于 2013-07-14T14:11:28.100 回答