Я немного борюсь с преобразованием XML-файла Filemaker во что-то более удобное для пользователя. FM по умолчанию сохраняет каждое предложение абзаца в элементе, и я бы хотел, чтобы все эти предложения были сгруппированы.
Ниже XML показывает, как это выглядит в необработанном виде:
<Para>
<ParaLine>
<String>This is just some spacefiller, so some text to </String>
</ParaLine>
<ParaLine>
<String>show how things look now. Go to </String>
<XRef>
<XRefName value="Heading"/>
</XRef>
<String>“</String>
<String>More info here</String>
<String>” </String>
</ParaLine>
<ParaLine>
<String>(page</String>
<Char value="HardSpace" type="enum"/>
<String>27)</String>
<XRefEnd/>
<String>to get more details.</String>
</ParaLine>
</Para>
Моя цель двоякая: сначала я хотел бы получить все строковые значения в любой группе [para]. Этого относительно легко добиться с помощью следующего xlst:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" xmlns="http://www.w3.org/1999/xhtml" encoding="UTF-8" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="normalize-space(.)"/>
</xsl:template>
<xsl:template match="/">
<xsl:result-document href="test.xml">
<xsl:apply-templates/>
</xsl:result-document>
</xsl:template>
<xsl:template match="String">
<xsl:choose>
<xsl:when test="preceding-sibling::*[1][name()='String']">
<xsl:text> </xsl:text>
<xsl:value-of select="text()"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="text()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="ParaLine">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="Char[@value='HardSpace']">
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
Итак, мой текущий результат выглядит так:
<Para>This is just some spacefiller, so some text to show how things look now. Go to
<XRef><XRefName value="Heading"/></XRef>
“ More info here ” (page 27)
<XRefEnd/>to get more details.
</Para>
Однако моя вторая цель - получить содержимое между [XRef] и [XRefEnd] в одном теге, я могу сделать это с помощью пары дополнительных преобразований, но мне было интересно, возможно ли это за одну поездку. Моей главной «мечтой» было бы стать ниже XML за одну поездку:
<Para>
<local xml:lang="en">This is just some spacefiller, so some text to show how things look now. Go to
<XRef XRefName="Heading">“ More info here ” (page 27)</XRef>
to get more details.</local>
Any tips on how I can do this with limited amount of transformations ?
Заранее спасибо !