2015-08-07 6 views
0

У меня есть XML-файл, root.xml:Как настроить набор атрибутов XML (эта область уже установлена)?

<root> 
     <procedure 
     topic-file="Procedure1" 
     status="Undefined"> 
     <title> Procedure Number 1 </title> 
    </procedure> 
    <procedure 
     topic-file="Procedure2" 
     status="Undefined"> 
     <title> Procedure Number 2 </title> 
    </procedure> 
    <procedure 
     topic-file="Procedure3" 
     status="Undefined"> 
     <title> Procedure Number 3 </title> 
    </procedure> 
    <procedure 
     topic-file="Procedure4" 
     status="Undefined"> 
     <title> Procedure Number 4 </title> 
    </procedure> 
</root> 

Обратите внимание, что я отслеживанием 4 процедур. Я хочу изменить статус 2 процедуры одним выстрелом. То, что я хочу изменить отмечается в этом XML-файле, statusByTitle.xml

<?xml version="1.0" encoding="UTF-8"?> 
    <statuses> 
     <status topic-file="Procedure1">Complete</status> 
     <status topic-file="Procedure3">Draft</status> 
    </statuses> 

Я хочу изменить статусы обеих процедур 1 и 3, как указано в одном кадре, так что я создал этот XSLT преобразование:

<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="*"/> 

    <!-- set up the key --> 
    <xsl:key name="statusByTitle" match="status" use="/topic-file" /> 

    <!-- identity transform --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- use the key to set the attribute of the correct procedure --> 

     <xsl:template 
     match="item[key('statusByTitle', status, document('statusByTitle.xml'))]/@status"> 
     <xsl:attribute name="status"> 
     <xsl:value-of select="key('statusByTitle', ../status, document('statusByTitle.xml'))" /> 
    </xsl:attribute> 
</xsl:template> 

Я запускаю это преобразование в Oxygen с использованием Saxon-HE 9.5.1.7, а выходной файл совпадает с входным файлом. Я уставился на это некоторое время и не могу найти ошибку. Я почему-то понял ключи?

ответ

1

<xsl:key name="statusByTitle" match="status" use="/topic-file" /> следует <xsl:key name="statusByTitle" match="status" use="@topic-file" />. И тогда у вас есть неправильное имя элемента item вместо procedure:

<xsl:template 
     match="procedure[key('statusByTitle', @topic-file, document('statusByTitle.xml'))]/@status"> 
     <xsl:attribute name="status" select="key('statusByTitle', ../@topic-file, document('statusByTitle.xml'))" /> 
</xsl:template> 

Все исправления вместе, я в конечном итоге с

<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:param name="status-url" select="'test2015080705.xml'"/> 
    <xsl:param name="status-doc" select="doc($status-url)"/> 

    <!-- set up the key --> 
    <xsl:key name="statusByTitle" match="status" use="@topic-file" /> 

    <!-- identity transform --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- use the key to set the attribute of the correct procedure --> 

    <xsl:template 
     match="procedure[key('statusByTitle', @topic-file, $status-doc)]/@status"> 
     <xsl:attribute name="status" select="key('statusByTitle', ../@topic-file, $status-doc)" /> 
    </xsl:template> 

</xsl:stylesheet> 

 Смежные вопросы

  • Нет связанных вопросов^_^