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.
Çok teşekkür ederim. 'Xsl: non-matching-substring' kullanmak harika bir fikirdir. – zx485