2016-03-29 12 views
0

Bölüm numaralarını, başlıklarını ve açıklamalarını XML dosyasından bir XML öğesi/öznitelik hiyerarşisine çıkarmak istiyorum. Sürekli olarak farklı öğelerde dağıtılırlar. XML şöyle görünür:XSLT 2.0: Bölüm numaraları ve açıklamaları sürekli metin düğümlerinden numaralandırmak için RegEx oluştur

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <cell>3.1.1.17 First Section The “First appropriate” section lists things that can occur when an event happens. All of these event conditions result in an error. 
    </cell> 
    <cell>3.1.1.18 Second Section This section lists things that occur under certain conditions. 3.1.1.19 Third Section This section lists events that occur within a specific space. 3.2 SPACE chapter provides descriptions other stuff. See also: Chapter 4, “Other Stuff Reference” in the Manual. 
    </cell> 
</root> 

İstenen çıkış aşağıdaki gibi görünmelidir:

<?xml version="1.0" encoding="utf-8"?> 
<Root> 
    <Desc chapter="3.1.1.17" title="First Section">The “First appropriate” section lists things that can occur when an event happens. All of these event conditions result in an error.</Desc> 
    <Desc chapter="3.1.1.18" title="Second Section">This section lists things that occur under certain conditions.</Desc> 
    <Desc chapter="3.1.1.19" title="Third Section">This section lists events that occur within a specific space. 3.2 SPACE chapter provides descriptions other stuff. See also: Chapter 4, “Other Stuff Reference” in the Manual.</Desc> 
</Root> 

Benim XSLT şimdiye kadar geçerli:

sorun son bölümünde yer almaktadır
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output indent="yes" method="xml" encoding="utf-8" /> 

    <xsl:template match="text()" /> 

    <xsl:template match="/root"> 
    <Root> 
     <xsl:apply-templates select="cell" /> 
    </Root> 
    </xsl:template> 

    <xsl:template match="cell"> 
    <xsl:variable name="sections" as="element(Desc)*"> 
     <xsl:analyze-string regex="(\d+\.\d+\.\d+\.\d+)\s(.*?Section)(.*?)" select="text()"> 
     <xsl:matching-substring> 
      <Desc chapter="{regex-group(1)}" title="{regex-group(2)}"> 
      <xsl:value-of select="regex-group(3)" /> 
      </Desc> 
     </xsl:matching-substring> 
     </xsl:analyze-string> 
    </xsl:variable> 
    <xsl:for-each select="$sections"> 
     <xsl:copy-of select="." /> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

RegEx: (.*?) - açgözlü olmayan bir tüketim ifadesi. Maalesef bunu doğru pozisyonda durduramam. Bir sonraki \d+\.\d+\.\d+\.\d+\.'dan önce tüketmeyi durdurmak için ?: ve (?=...) kullanmayı denedim, ancak XSLT-2.0'ın RegEx sözdizimi diğer lehçelerden biraz farklı görünüyor.

for-each'da regex-group(1..3) olarak uygun şekilde işlemek için ilgili bölümleri nasıl ayırım?

Ayrıca, tüm RegEx belirteçlerinin oldukça eksiksiz bir XSLT 2.0 referansıyla ilgileniyorum.

cevap

0

O

<xsl:template match="cell"> 
    <xsl:variable name="sections"> 
     <xsl:analyze-string regex="(\d+\.\d+\.\d+\.\d+)\s(.*?Section)" select="."> 
      <xsl:matching-substring> 
       <xsl:message select="concat('|', regex-group(3), '|')"/> 
       <Desc chapter="{regex-group(1)}" title="{regex-group(2)}"> 
        <xsl:value-of select="regex-group(3)" /> 
       </Desc> 
      </xsl:matching-substring> 
      <xsl:non-matching-substring> 
       <Value> 
        <xsl:value-of select="."/> 
       </Value> 
      </xsl:non-matching-substring> 
     </xsl:analyze-string> 
    </xsl:variable> 
    <xsl:for-each select="$sections/Desc"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:value-of select="following-sibling::Value[1]"/> 
     </xsl:copy> 
    </xsl:for-each> 
</xsl:template> 

seçmek istediğiniz veri ve sondaki metin hem yakalar görünüyor.

+0

Çok teşekkür ederim. 'Xsl: non-matching-substring' kullanmak harika bir fikirdir. – zx485

0

JS'ye cevap vermem için özür dilerim, ancak güveniyorum, neler olduğunu anlayabilirsiniz. İntikamınız ve yerine koyduğunuz çözüm böyle olmalıdır;

var xmlData = '<?xml version="1.0" encoding="utf-8"?>\n<root>\n <cell>3.1.1.17 First Section The “First appropriate” section lists things that can occur when an event happens. All of these event conditions result in an error.\n </cell>\n <cell>3.1.1.18 Second Section This section lists things that occur under certain conditions. 3.1.1.19 Third Section This section lists events that occur within a specific space. 3.2 SPACE chapter provides descriptions other stuff. See also: Chapter 4, “Other Stuff Reference” in the Manual.\n </cell>\n</root>', 
     rex = /<cell>(?:\s*(\d+.\d+.\d+.\d+)\s+(\w+)\s+Section)(.+)\n*\s*<\/cell>/gm, 
     xml = xmlData.replace(rex,'<Desc chapter="$1" title="$2 Section">$3</desc>'); 
console.log(xmlData); 
<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <Desc chapter="3.1.1.17" title="First Section"> The “First appropriate” section lists things that can occur when an event happens. All of these event conditions result in an error.</desc> 
    <Desc chapter="3.1.1.18" title="Second Section"> This section lists things that occur under certain conditions. 3.1.1.19 Third Section This section lists events that occur within a specific space. 3.2 SPACE chapter provides descriptions other stuff. See also: Chapter 4, “Other Stuff Reference” in the Manual.</desc> 
</root>