1

編集:将来これに来る人にとって、これは不十分に書かれた質問でした。それは私が求めていたものではありませんでした。 この質問はあなたにも役立つかもしれません。

それで、私XSLT は過去数日間をブラッシュアップしようとしています。私はこれに非常に慣れておらず、過去のほとんどをXQueryXML の変換に使用していました。かなり単純な問題で立ち往生していますが、周りを見回しても明確な解決策が見つかりません。簡単に言えば、いくつかの要素をその子に応じて 2 つに分割したいと考えています。

たとえば、XML が次のようになっているとします。

<?xml version="1.0" encoding="UTF-8"?>    
<root>
      <p>
         Bacon ipsum dolor sit amet bacon chuck pastrami swine pork rump, shoulder beef ribs doner tri-tip 
         tongue. Tri-tip ground round short ribs capicola meatloaf shank drumstick short loin pastrami t-
         bone. Sirloin turducken short ribs t-bone andouille strip steak pork loin corned beef hamburger 
         bacon filet mignon pork chop tail.
         <note.ref id="0001"><super>1</super></note.ref>
         <note id="0001">
           <p>
             You may need to consult a latin butcher. Good Luck.
           </p>
         </note>   
       Pork loin ribeye bacon pastrami drumstick sirloin, shoulder pig jowl. Salami brisket rump ham, tail
      hamburger strip steak pig ham hock short ribs jerky shank beef spare ribs. Capicola short ribs swine   
      beef meatball jowl pork belly. Doner leberkas short ribs, flank chuck pancetta bresaola bacon ham 
      hock pork hamburger fatback.
    </p>
    </root>

my を実行するxslと、次のようなものが残ります。

<html>
<body>
   <p>
         Bacon ipsum dolor sit amet bacon chuck pastrami swine pork rump, shoulder beef ribs doner tri-tip 
         tongue. Tri-tip ground round short ribs capicola meatloaf shank drumstick short loin pastrami t-
         bone. Sirloin turducken short ribs t-bone andouille strip steak pork loin corned beef hamburger 
         bacon filet mignon pork chop tail.
         <span class="noteRef" id="0001"><sup>1</sup></span>
         <div id="note-0001"> 
           <p>
               You may need to consult a latin butcher. Good Luck.
           </p>
         </div>
           Pork loin ribeye bacon pastrami drumstick sirloin, shoulder pig jowl. Salami brisket rump ham, tail
           hamburger strip steak pig ham hock short ribs jerky shank beef spare ribs. Capicola short ribs swine   
           beef meatball jowl pork belly. Doner leberkas short ribs, flank chuck pancetta bresaola bacon ham 
           hock pork hamburger fatback.
   </p>
</body>
</html>

これに関する問題は明らかに、を子としてHTML <p>持つことができないことです。これは無効です。クロムなどのブラウザは、最初の段落を にヒットしたときに終了するようにレンダリングし、適切にノートを独自の にラップしますが、ノートの後にテキストを孤立させたままにします。そのため、に適用された CSS は適用されません。<div><p><div><p><p>

<p>要素の子孫に応じて、1 つの要素を 2 つに分割するにはどうすればよいですか?

望ましい出力

  <html>
    <body>
       <p>
             Bacon ipsum dolor sit amet bacon chuck pastrami swine pork rump, shoulder beef ribs doner tri-tip 
             tongue. Tri-tip ground round short ribs capicola meatloaf shank drumstick short loin pastrami t-
             bone. Sirloin turducken short ribs t-bone andouille strip steak pork loin corned beef hamburger 
             bacon filet mignon pork chop tail.
             <span class="noteRef" id="0001"><sup>1</sup></span><
</p>
             <div id="note-0001"> 
               <p>
                   You may need to consult a latin butcher. Good Luck.
               </p>
             </div>
<p>
               Pork loin ribeye bacon pastrami drumstick sirloin, shoulder pig jowl. Salami brisket rump ham, tail
               hamburger strip steak pig ham hock short ribs jerky shank beef spare ribs. Capicola short ribs swine   
               beef meatball jowl pork belly. Doner leberkas short ribs, flank chuck pancetta bresaola bacon ham 
               hock pork hamburger fatback.
       </p>
    </body>
    </html>

私は自分の質問を少し抽象化したので、XSL私が試したことの以下は少しずれている可能性があります.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
    exclude-result-prefixes="xs xd" version="2.0">


<xsl:template match="/">

        <html>
          <body>
             <xsl:apply-templates/>
          </body>
        </html>
</xsl:template>

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


    <xsl:template match="note.ref">
        <span class="noteRef" id="{@id}">
            <xsl:apply-templates/>
        </span>
    </xsl:template>

    <xsl:template match="super">
        <sup>
            <xsl:apply-templates/>
        </sup>
    </xsl:template>

    <xsl:template match="note">
          <div id="note-{@id}">
            <xsl:apply-templates/>
        </div>
    </xsl:template>

</xsl:stylesheet>
4

2 に答える 2

1

XSLT 2.0プロセッサを使用すると、次のfor-each-groupことが役立つと思います。

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs"
  version="2.0">

<xsl:output method="html" indent="yes" version="5.0"/>

<xsl:template match="/">
  <html>
    <body>
      <xsl:apply-templates/>
    </body>
  </html>
</xsl:template>

<xsl:template match="p[not((.//p, .//div))]">
  <xsl:copy>
    <xsl:apply-templates select="@* , node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="p[.//p, .//div]">
  <xsl:for-each-group select="node()" group-adjacent="boolean((self::text(), self::note.ref))">
    <xsl:choose>
      <xsl:when test="current-grouping-key()">
        <p>
          <xsl:apply-templates select="current()/@*, current-group()"/>
        </p>
      </xsl:when>
      <xsl:otherwise>
        <xsl:apply-templates select="current-group()"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each-group>
</xsl:template>

<xsl:template match="note.ref">
    <span class="noteRef" id="{@id}">
        <xsl:apply-templates/>
    </span>
</xsl:template>

<xsl:template match="super">
    <sup>
        <xsl:apply-templates/>
    </sup>
</xsl:template>

<xsl:template match="note">
      <div id="note-{@id}">
        <xsl:apply-templates/>
    </div>
</xsl:template>

</xsl:stylesheet>

パターンp[not((.//p, .//div))]と式は、入力で予期され、同じ処理を必要とする他のタイプのノードをカバーするように拡張する必要がある場合がありますp[.//p, .//div]group-adjacentboolean((self::text(), self::note.ref))

于 2012-12-12T13:41:55.113 に答える
1

text()これは単純すぎるかもしれませんが、 apを含む aで を一致させ、それをラップすることを試みることができます(それに続くものnoteと一緒に)...note.reftext()

XML 入力

<root>
    <p>
        Bacon ipsum dolor sit amet bacon chuck pastrami swine pork rump, shoulder beef ribs doner tri-tip 
        tongue. Tri-tip ground round short ribs capicola meatloaf shank drumstick short loin pastrami t-
        bone. Sirloin turducken short ribs t-bone andouille strip steak pork loin corned beef hamburger 
        bacon filet mignon pork chop tail.
        <note.ref id="0001"><super>1</super></note.ref>
        <note id="0001">
            <p>
                You may need to consult a latin butcher. Good Luck.
            </p>
        </note>   
        Pork loin ribeye bacon pastrami drumstick sirloin, shoulder pig jowl. Salami brisket rump ham, tail
        hamburger strip steak pig ham hock short ribs jerky shank beef spare ribs. Capicola short ribs swine   
        beef meatball jowl pork belly. Doner leberkas short ribs, flank chuck pancetta bresaola bacon ham 
        hock pork hamburger fatback.
    </p>
</root>

XSLT 2.0 (1.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="@*|*|processing-instruction()|comment()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/root">        
        <html>
            <body>
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="p[note]">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="p[note]/text()">
        <p>
            <xsl:value-of select="normalize-space(.)"/>
            <xsl:apply-templates select="following-sibling::note.ref" mode="keep"/>
        </p>
    </xsl:template> 

    <xsl:template match="note">
        <div id="note-{@id}">
            <xsl:apply-templates/>
        </div>
    </xsl:template>

    <xsl:template match="note.ref"/>
    <xsl:template match="note.ref" mode="keep">
        <span class="noteRef" id="{@id}">
            <xsl:apply-templates/>
        </span>
    </xsl:template>

    <xsl:template match="super">
        <sup>
            <xsl:apply-templates/>
        </sup>
    </xsl:template>

    <xsl:template match="text()">
        <xsl:value-of select="normalize-space(.)"/>
    </xsl:template>

</xsl:stylesheet>

出力

<html>
   <body>
      <p>Bacon ipsum dolor sit amet bacon chuck pastrami swine pork rump, shoulder beef ribs
         doner tri-tip tongue. Tri-tip ground round short ribs capicola meatloaf shank drumstick
         short loin pastrami t- bone. Sirloin turducken short ribs t-bone andouille strip steak
         pork loin corned beef hamburger bacon filet mignon pork chop tail.<span class="noteRef" id="0001"><sup>1</sup></span></p>
      <div id="note-0001">
         <p>You may need to consult a latin butcher. Good Luck.</p>
      </div>
      <p>Pork loin ribeye bacon pastrami drumstick sirloin, shoulder pig jowl. Salami brisket
         rump ham, tail hamburger strip steak pig ham hock short ribs jerky shank beef spare
         ribs. Capicola short ribs swine beef meatball jowl pork belly. Doner leberkas short
         ribs, flank chuck pancetta bresaola bacon ham hock pork hamburger fatback.
      </p>
   </body>
</html>
于 2012-12-11T21:01:28.687 に答える