XML-документ разделен переносами строк - PullRequest
0 голосов
/ 20 апреля 2019
I need to be able to output the text of an XML document separated by line breaks

проверьте пожалуйста, в чем проблема моего кода xml: -

Уголовное право - Полиция - Назначение на ответственные должности - Генеральный директор полиции (DGP)

Need output following
<ShortNote>
<SNHeading1>Criminal Law</SNHeading1>
<SNHeading2>Police</SNHeading2>
<SNHeading3>#Appointment to Sensitive Posts</SNHeading3>
<SNHeading4>Director General of Police (DGP)</SNHeading4>
</ShortNote>

following code use but not output according to me:-
<xsl:template match="ShortNote/CatchWord">
    <xsl:param name="text" select="normalize-space(.)"/>
            <xsl:if test="normalize-space(substring-before(concat($text,'&#8212;'),'&#8212;'))!=''">
    <xsl:element name="SNHeading{position()}">
        <xsl:value-of select="normalize-space(substring-before(concat($text,'&#8212;'),'&#8212;'))"/>
    </xsl:element>
    </xsl:if>
    <xsl:if test="contains($text,'&#8212;')">
        <xsl:message><xsl:value-of select="."/></xsl:message>
        <xsl:element name="SNHeading{position()+1}">
        <xsl:apply-templates select=".">
            <xsl:with-param name="text" select="substring-after($text,'&#8212;')"/>
        </xsl:apply-templates>
        </xsl:element>
    </xsl:if>
</xsl:template>

1 Ответ

1 голос
/ 20 апреля 2019

Если принять хотя бы XSLT 2.0, я думаю, что вы можете просто обработать CatchWord/tokenize(., '—'), например. в XSLT 3

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

  <xsl:output indent="yes"/>

  <xsl:template match="ShortNote">
      <xsl:copy>
         <xsl:apply-templates select="CatchWord!tokenize(., '—')!normalize-space()"/> 
      </xsl:copy>
  </xsl:template>

  <xsl:template match=".[. instance of xs:string]" expand-text="yes">
      <xsl:element name="SNHeading{position()}">{.}</xsl:element>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / bFN1y9u

Для XSLT 2, где вы не можете найти соответствие по строке, вы можете использовать xsl:for-each:

  <xsl:template match="ShortNote">
      <xsl:copy>
         <xsl:for-each select="for $s in CatchWord/tokenize(., '—') return normalize-space($s)">
            <xsl:element name="SNHeading{position()}">
                <xsl:value-of select="."/>
            </xsl:element>
         </xsl:for-each>
      </xsl:copy>
  </xsl:template>

https://xsltfiddle.liberty -development.net / bFN1y9u / 1

...