Нужно получить значения атрибута из XSL - PullRequest
0 голосов
/ 03 октября 2019

Я работал над созданием имен элементов и атрибутов, а также элементов вывода и атрибутов. Здесь я преобразовываю входной xml в docbook xml с помощью Oxygen XML Editor 18.0.

У меня вводится xml вроде:

<Section1 id="1">
   <Section1Heading>Section 1</Section1Heading>
  <Section2 id="2">
    <Section2Heading>Heading</Section2Heading>
    <Para>other.</Para>
  </Section2>
</Section1>

XSL У меня есть:

<xsl:template match="Section1">
   <sect1>
       <xsl:attribute name="label">
          <xsl:value-of select="@id"/>
       </xsl:attribute>
      <xsl:apply-templates/>
   </sect1>
</xsl:template>

<xsl:template match="Section1Heading | Section2Heading">
    <title>
        <xsl:apply-templates/>
    </title>
</xsl:template>

<xsl:template match="Section2">
   <sect2>
      <xsl:attribute name="label">
         <xsl:value-of select="@id"/>
      </xsl:attribute>
      <xsl:apply-templates/>
   </sect2>
</xsl:template>

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

Пробовал XSL, как показано ниже:

  <xsl:param name="field-sep" as="xs:string">,</xsl:param>
  <xsl:param name="line-sep" as="xs:string" select="'&#10;'"/>

  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
      <xsl:value-of select="concat('Input XML', $field-sep, 'Result XML')"/>
      <xsl:value-of select="$line-sep"/>
      <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="xsl:template[@match]">
    <xsl:value-of 
       select="for $pattern in tokenize(@match, '\s*\|\s*')
               return concat($pattern, $field-sep, node-name(current()/*[1]))"
       separator="{$line-sep}"/>
       <xsl:value-of select="$line-sep"/>
  </xsl:template>

Ожидаемый результат будет:

Input XML,Result XML
Section1,sect1
@id,label
Section1Heading,title
Section2Heading,title
Section2,sect2
@id,label
Para,para

1 Ответ

0 голосов
/ 03 октября 2019

Я думаю, что это даст желаемый результат, хотя он зависит от вашего XSLT, имеющего очень ограниченную структуру (например, предполагается, что xsl:attribute всегда содержит xsl:value-of)

<xsl:template match="xsl:template[@match]">
  <xsl:variable name="current" select="." />
  <xsl:for-each select="tokenize(@match, '\s*\|\s*')">
    <xsl:value-of select="concat(., $field-sep, node-name($current/*[1]))" />
    <xsl:value-of select="$line-sep"/>
    <xsl:for-each select="$current/*[1]/xsl:attribute">
      <xsl:value-of select="concat(xsl:value-of[1]/@select, $field-sep, @name)" />
      <xsl:value-of select="$line-sep"/>
    </xsl:for-each>
  </xsl:for-each>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...