2017-01-27 7 views
0

Input.xmlXSL копия затем заменить атрибуты

<human gender="male" nationality="american"> 
    <property>blank</property> 
</human> 

(желательные) output.xml

<human gender="male" nationality="american"> 
    <property>blank</property> 
</human> 
<person gender="female" nationality="british"> 
    <property>blank</property> 
</person> 

Привет, ребята, выше мой желаемого преобразования. У меня есть следующий XSL до сих пор:

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

Но как я идти о замене значения атрибутов Я попытался с помощью XSL: выбрать, но без удачи

+1

Ваш желаемый результат документ не является хорошо сформированный XML документ и я бы рекомендовал вам: a) создать документ, в котором есть один внешний элемент (со всем остальным внутри) или b) сделать не называйте его '* .xml'. Также, пожалуйста, покажите полную минимальную таблицу стилей XSLT. Благодарю. Дополнительная справка: http://stackoverflow.com/help/mcve. –

ответ

1

Ваша таблица стилей была рядом, он просто не хватает шаблона сопоставляя те узлы, которые не совпадают с вашим другим шаблоном, поэтому они не подхватываются built-in templates of XSLT.

Для преобразования атрибутов, которые я выбрал для введения режимов, так что некоторые шаблоны соответствуют только во втором случае, когда вы хотите изменить значения атрибута.

Следующая таблица стилей

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

<xsl:template match="human"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    <person> 
     <!-- mode is used to separate this case from the other where things are copied unchanged --> 
     <xsl:apply-templates select="node()|@*" mode="other" /> 
    </person> 
</xsl:template> 

<!-- templates for normal mode --> 

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

<!-- templates for "other" mode --> 

<xsl:template match="@gender" mode="other"> 
    <xsl:attribute name="gender"> 
     <xsl:if test=". = 'male'">female</xsl:if> 
     <xsl:if test=". = 'female'">male</xsl:if> 
    </xsl:attribute> 
</xsl:template> 

<xsl:template match="@nationality" mode="other"> 
    <xsl:attribute name="nationality"> 
     <xsl:if test=". = 'american'">british</xsl:if> 
     <xsl:if test=". = 'british'">american</xsl:if> 
    </xsl:attribute> 
</xsl:template> 

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

</xsl:stylesheet> 

при применении к этому входу:

<human gender="male" nationality="american"> 
    <property>blank</property> 
</human> 

дает следующий результат:

<?xml version="1.0" encoding="UTF-8"?> 
<human gender="male" nationality="american"> 
    <property>blank</property> 
</human> 
<person gender="female" nationality="british"> 
    <property>blank</property> 
</person> 
+0

Пожалуйста, не отвечайте слишком рано, что потенциально мешает аферу редактировать и улучшать их вопрос. Ваш вывод не совсем прав, один из полов должен быть «женским» и «британским» должен быть в нем. –

+0

Tks для ответа. К сожалению, у меня есть прецедент превращения американского человека в британскую даму .... – delita

+1

Я обновил свой ответ, чтобы отразить это. Первая версия просто объяснила очевидную неполноту оригинальной таблицы стилей. Простите за это. – hielsnoppe

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