2

私は xml ファイルを持っており、複雑なルールで xslt を使用して翻訳したいと考えています。ソース xml は次のようになります。

<analysis>
    <blocks>
        <block id="35" original="5,13">
            <contain>6 ,7</contain>
        </block>
        <block id="33" original="20">
            <contain>11, 8, 9, 10</contain>
        </block>
    </blocks>
    <images>
        <image id = "11">./img/a.jpg </image>
    </images>
    <lines>
        <line id="6"/>
            <char font="2">a</char>
            <char font="2">a</char>
            <char font="2">a</char>
            <char font="2">a</char>
        <line id="7"/>
            <char font="2">b</char>
            <char font="2">b</char>
            <char font="2">b</char>
            <char font="2">b</char>
        <line id="8"/>
            <char font="2">c</char>
            <char font="2">c</char>
            <char font="2">c</char>
            <char font="2">c</char>
        <line id="9"/>
            <char font="2">d</char>
            <char font="2">d</char>
            <char font="2">d</char>
            <char font="2">d</char>
        <line id="10"/>
            <char font="2">e</char>
            <char font="2">e</char>
            <char font="2">e</char>
            <char font="2">e</char>
    </lines>
</analysis>

結果のxmlは次のとおりです。

<result>
    <block id="35">
        <text>
            aaaabbbb
        </text>
    </block>
    <block id="33">
        <text>
            cccc
        </text>
        <image ref="./img/a.jpg"/>
        <text>
            ddddeeee
        </text>
    </block>
</result>

ルールは次のとおりです。タグ「block」の下に「contain」フラグがあり、その内容はブロックが参照する ID セットです。

4

2 に答える 2

1

意味をなさない質問の唯一の部分は、出力の 2 つの要素imgの間でどのようになるかです。text

以下は XSLT 2.0 の例です。正確ではありませんが、必要なものを達成するために変更するのに十分近いかもしれません。

XML 入力

<analysis>
    <blocks>
        <block id="35" original="5,13">
            <contain>6 ,7</contain>
        </block>
        <block id="33" original="20">
            <contain>11, 8, 9, 10</contain>
        </block>
    </blocks>
    <images>
        <image id = "11">./img/a.jpg </image>
    </images>
    <lines>
        <line id="6"/>
            <char font="2">a</char>
            <char font="2">a</char>
            <char font="2">a</char>
            <char font="2">a</char>
        <line id="7"/>
            <char font="2">b</char>
            <char font="2">b</char>
            <char font="2">b</char>
            <char font="2">b</char>
        <line id="8"/>
            <char font="2">c</char>
            <char font="2">c</char>
            <char font="2">c</char>
            <char font="2">c</char>
        <line id="9"/>
            <char font="2">d</char>
            <char font="2">d</char>
            <char font="2">d</char>
            <char font="2">d</char>
        <line id="10"/>
            <char font="2">e</char>
            <char font="2">e</char>
            <char font="2">e</char>
            <char font="2">e</char>
    </lines>
</analysis>

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="/">
        <results>
            <xsl:apply-templates select="analysis/blocks/block"/>
        </results>
    </xsl:template>

    <xsl:template match="block">
        <xsl:copy>
            <xsl:apply-templates select="@*[not(name()='original')]"/>
            <xsl:apply-templates select="/*/*/image[@id=tokenize(current()/contain,'\s*,\s*')]"/>
            <text>
                <xsl:apply-templates select="/*/*/line[@id=tokenize(current()/contain,'\s*,\s*')]/following-sibling::char[preceding-sibling::line[1][@id=tokenize(current()/contain,'\s*,\s*')]]/text()"/>
            </text>         
        </xsl:copy>     
    </xsl:template>

    <xsl:template match="image">
        <image ref="{normalize-space(.)}"/>
    </xsl:template>

</xsl:stylesheet>

XML 出力

<results>
   <block id="35">
      <text>aaaabbbb</text>
   </block>
   <block id="33">
      <image ref="./img/a.jpg"/>
      <text>ccccddddeeee</text>
   </block>
</results>
于 2012-05-31T07:24:00.830 に答える
0

このスタイルシート...

<xsl:stylesheet
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" >
<xsl:output method="xml" indent="yes" encoding="utf-8" />
<xsl:strip-space elements="text"/>
<xsl:key name="text-resource" match="line" use="normalize-space(@id)" />
<xsl:key name="image-resource" match="image" use="normalize-space(@id)" />

<xsl:template match="/">
 <result>
  <xsl:apply-templates select="analysis/blocks/block" />
 </result>
</xsl:template>

<xsl:template match="block">
  <block id="{@id}">
  <xsl:variable name="block" select="." />

  <xsl:variable name="block-texts" as="xs:string+">
    <xsl:for-each select="tokenize(contain/text(),'\s?,\s?')" >
     <xsl:variable name="id" select="." />
     <xsl:for-each select="$block" >
      <xsl:sequence select="key('text-resource',$id)/following-sibling::char[preceding-sibling::line[1][@id=$id]]" />
     </xsl:for-each>
    </xsl:for-each>
  </xsl:variable>

  <xsl:if test="count( $block-texts) != 0" >
   <text>
    <xsl:for-each select="$block-texts" >
     <xsl:value-of select="." />
    </xsl:for-each>
   </text>
  </xsl:if>

    <xsl:for-each select="tokenize(contain/text(),'\s?,\s?')" >
     <xsl:variable name="id" select="." />
     <xsl:for-each select="$block" >
      <xsl:for-each select="key('image-resource',$id)" >
       <image href="{.}" />
      </xsl:for-each>
      </xsl:for-each>
     </xsl:for-each>
  </block>
</xsl:template>

</xsl:stylesheet>

...質問で指定された入力ドキュメントに適用すると、...

<?xml version="1.0" encoding="utf-8"?>
<result xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <block id="35">
      <text>aaaabbbb</text>
   </block>
   <block id="33">
      <text>ccccddddeeee</text>
      <image href="./img/a.jpg "/>
   </block>
</result>

私の最も近い解決策を見つけていただければ幸いです。

于 2012-05-31T09:58:11.730 に答える