2015-03-10 4 views
1

Я делаю MODS для преобразования MODS на следующий xml. Я значительно упростил для ясности:Создание преобразованного элемента дочерний элемент sibling

<?xml version="1.0" encoding="UTF-8"?> 
<OAI-PMH> 
    <metadata> 
    <mods> 
     <genre>Negatives (photographic)</genre> 
     <genre>Cellulose nitrate film</genre> 
     <physicalDescription> 
     <form>Photograph</form> 
     </physicalDescription> 
    </mods> 
</metadata></OAI-PMH> 

мне нужен этот результат, где genre элементы были уже сделали form элементы, которые являются потомками уже существующего physicalTransform элемента:

<?xml version="1.0" encoding="UTF-8"?> 
<OAI-PMH> 
    <metadata> 
    <mods> 
     <physicalDescription> 
     <form>Photograph</form> 
     <form>Negatives (photographic)</form> 
     <form>Cellulose nitrate film</form> 
     </physicalDescription> 
    </mods> 
</metadata></OAI-PMH> 

Как я продолжайте это делать? Я пробовал:

<xsl:template match="mods:physicalDescription"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     <xsl:apply-templates select="mods:genre"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="mods:genre"> 
    <xsl:element namespace="http://www.loc.gov/mods/v3" name="form" > 
     <xsl:value-of select="normalize-space(.)"/>
 
    </xsl:element>
 
</xsl:template> 

Но он не работает. Я уверен, что мне не хватает чего-то простого, но я не могу определить, что. Любая помощь будет оценена. Благодарю.

ответ

0

Вы имеете в виду пространство имен, но не объявили это пространство имен во входном XML. Я предполагаю, что это пространство имен по умолчанию:

XML Input

<?xml version="1.0" encoding="UTF-8"?> 
<OAI-PMH xmlns="http://www.loc.gov/mods/v3"> 
    <metadata> 
    <mods> 
     <genre>Negatives (photographic)</genre> 
     <genre>Cellulose nitrate film</genre> 
     <physicalDescription> 
     <form>Photograph</form> 
     </physicalDescription> 
    </mods> 
</metadata> 
</OAI-PMH> 

В таблице стилей вы в курсе, есть невидимые символы пробела, которые вы должны удалить. Кроме того, должен существовать механизм, который создает верную копию ввода, на основе которой вы можете определить изменения - это называется шаблоном .

Затем внутри шаблона для матча mods:physicalDescription, найти все mods:genre элементы, которые и родственных элементов вывода Элемент form для каждого из них, в том же пространстве имен.

. Добавить последний шаблон, который соответствует mods:genre, его больше не нужно обрабатывать отдельно.

таблицы стилей XSLT

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
xmlns:mods="http://www.loc.gov/mods/v3" 
exclude-result-prefixes="mods"> 

    <xsl:output method="xml" encoding="UTF-8" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="mods:physicalDescription"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     <xsl:for-each select="../mods:genre"> 
      <form xmlns="http://www.loc.gov/mods/v3"> 
       <xsl:apply-templates select="@*|node()"/> 
      </form> 
     </xsl:for-each> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="mods:genre"/> 

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

</xsl:transform> 

XML Output

Как вы можете видеть, это производит именно вывод, который вы запросили, за исключением имен по умолчанию, который не включал.

<?xml version="1.0" encoding="UTF-8"?> 
<OAI-PMH xmlns="http://www.loc.gov/mods/v3"> 
    <metadata> 
     <mods> 
     <physicalDescription> 
      <form>Photograph</form> 
      <form>Negatives (photographic)</form> 
      <form>Cellulose nitrate film</form> 
     </physicalDescription> 
     </mods> 
    </metadata> 
</OAI-PMH> 
+0

Спасибо. Я, возможно, упростил примеры. Я уже использовал шаблон идентификации в своем фактическом коде, а также использовал правильные пространства имен. Я, вероятно, должен был удалить моды: префикс из шаблонов, поскольку это вводило в заблуждение. В любом случае, спасибо за ваш ответ, который действительно решает проблему. Я буду помнить, чтобы быть более осторожным при построении примеров. – jmignault

+0

@jmignault Добро пожаловать. Если у вас есть вопрос о том, как интегрировать этот ответ в существующий код, отправьте его все, и я рад помочь. Но в таком случае вы должны задать новый вопрос. –

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