2017-02-09 7 views
0

Как переместить элемент 'affiliation' в элемент 'contrib', который находится в контексте «для каждого» в XSLT?Как переместить элемент в другой преобразованный элемент в XSLT?

Входной XML:

<article> 
    <authors>Amrendra, Kumar; Mohan, Kumar</authors> 
    <affiliation id="Amrendra, Kumar">Amrendra, Kumar</affiliation> 
    <affiliation id="Mohan, Kumar">Mohan, Kumar</affiliation> 
</article> 

Выходной ток:

<contrib-group> 
    <contrib> 
    <string-name>Amrendra, Kumar</string-name> 
    </contrib> 
    <contrib> 
    <string-name>Mohan, Kumar</string-name> 
    </contrib> 
    <aff id="Amrendra, Kumar">Amrendra, Kumar</aff> 
    <aff id="Mohan, Kumar">Mohan, Kumar</aff> 
</contrib-group> 

XSLT Код:

<xsl:template match="authors"> 
    <xsl:choose> 
     <xsl:when test="not(node())"/> 
     <xsl:otherwise> 
      <contrib-group> 
       <xsl:for-each select="tokenize(., ';')"> 
       <contrib> 
        <string-name> 
         <xsl:value-of select="normalize-space(.)"/> 
        </string-name> 
       </contrib> 
       </xsl:for-each> 
       <xsl:apply-templates select="../affiliation"/> 
      </contrib-group> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

Обязательный выход: (Matching с AFF/@ идентификатор и вно/# PCDATA)

<contrib-group> 
    <contrib> 
    <string-name>Amrendra, Kumar</string-name> 
    <aff id="Amrendra, Kumar">Amrendra, Kumar</aff> 
    </contrib> 
    <contrib> 
    <string-name>Mohan, Kumar</string-name> 
    <aff id="Mohan, Kumar">Mohan, Kumar</aff> 
    </contrib> 
</contrib-group> 

, когда я пытаюсь применить элемент «принадлежность» внутри вно, то он показывает ниже ошибки:

[Saxon-PE 9.5.1.7] XPTY0020: Cannot select the parent of the context node: the context item is not a node 
+0

Можете ли вы показать полный XSLT, который демонстрирует вашу проблему, пожалуйста? Я не думаю, что показанный шаблон приводит к ошибке, если только ваш фактический XSLT не имеет '' в структуре 'xsl: for-each', не после этого. Спасибо. –

+0

Что конкретно связывает автор с соответствующей «принадлежностью»? У вас одинаковые значения в трех местах, трудно сказать, какую пару использовать. –

ответ

0

Если предположить, что authors строка содержит маркеры, идентичные значениям affiliation/@id, вы могли бы сделать:

XSLT 2,0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="aff" match="affiliation" use="@id" /> 

<xsl:template match="article"> 
    <xsl:variable name="current-article" select="." /> 
    <contrib-group> 
     <xsl:for-each select="tokenize(authors, '; ')"> 
      <contrib> 
       <string-name> 
        <xsl:value-of select="."/> 
       </string-name> 
       <xsl:apply-templates select="key('aff', ., $current-article)[node()]"/> 
      </contrib> 
     </xsl:for-each> 
    </contrib-group> 
</xsl:template> 

<xsl:template match="affiliation"> 
    <aff> 
     <xsl:copy-of select="@* | node()" /> 
    </aff> 
</xsl:template> 

</xsl:stylesheet> 

получить й e требуемый выход.

+0

Спасибо. Теперь я получил результат, но всегда его приход с пустым партнером с @id. У меня есть еще две проблемы: 1) если у нас есть некоторые данные внутри 'affiliation'. текущая логика делает пустой. 2) Если «аффилиация» пуста, не нужно генерировать «aff»? –

+0

@AmrendraKumar Я сделал пару изменений, посмотрю, удовлетворяет ли это ваши проблемы. –

0
<aff id="{.}"> 
    <xsl:value-of select="key('aff', ., $current-article)" /> 
</aff> 

должно быть изменение с для избежания пробелов и пропущенных значений

<aff id="{normalize-space(.)}"> 
    <xsl:value-of select="key('aff', normalize-space(.), $current-article)" /> 
</aff> 
+0

Спасибо! Я объединил оба ваших комментария, и я получил его. Но мне нужно еще одно изменение, если «принадлежность» пуста (нет PCDATA), а затем отбросит «аффилированность». еще раз спасибо –