2015-11-19 4 views
0

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

<?xml version="1.0" encoding="UTF-8"?> 
<person> 
<name> 
    <given_name>Peter</given_name> 
    <surname>Pan</surname> 
    <title>PhD</title> 
</name> 
<contactdata> 
    <email>[email protected]</email> 
    <office> 
     <building>B10</building> 
     <room>016</room> 
    </office> 
    <phone type="office"></phone> 
</contactdata> 
<organization> 
    <group>Something Cool</group> 
    <department>Awesome Stuff!!!</department> 
</organization> 

Будет transformated в:

<?xml version="1.0" encoding="UTF-8"?> 
<shallow> 
    <person /> 
    <person-name /> 
    <person-name-given_name /> 
    <person-name-surname /> 
    <person-name-title /> 
    <person-contactdata /> 
    <person-contactdata-email /> 
    <person-contactdata-office /> 
    <person-contactdata-office-building /> 
    <person-contactdata-office-room /> 
    <person-contactdata-phone /> 
    <person-organization /> 
    <person-organization-group /> 
    <person-organization-department /> 
</shallow> 

Мой код до сих пор:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="/*"> 
    <shallow> 
    <xsl:apply-templates> 
    <xsl:with-param name="predecessor" select="local-name()"/> 
    </xsl:apply-templates> 
    </shallow> 
</xsl:template> 

<xsl:template match="*"> 
<xsl:param name="predecessor"/> 
    <xsl:element name="{$predecessor}"/> 
    <xsl:apply-templates> 
    <xsl:with-param name="predecessor" select="concat($predecessor, '-', local-name())"/> 
    </xsl:apply-templates> 
</xsl:template> 
</xsl:stylesheet> 

Но это будет только итерацию до первого ребенка все и выход не совсем прав .....

Буду признателен за любую помощь, спасибо большое!

ответ

0

Он правильно выполняет итерацию; это имя выходного элемента, которое не вычисляется должным образом.

Вам просто нужно изменить:

<xsl:element name="{$predecessor}"/> 

с:

<xsl:element name="{concat($predecessor, '-', local-name())}"/> 

PS: текст, содержащийся в тегах также выход, это может быть исправлено с этой дополнительной модификации (при необходимости) :

<xsl:apply-templates select="*"> 
     <xsl:with-param name="predecessor" select="concat($predecessor, '-', local-name())"/> 
    </xsl:apply-templates> 

С учетом всех этих изменений, то здесь мой выходной до сих пор:

<?xml version="1.0" encoding="UTF-8"?> 
<shallow> 
    <person-name/> 
    <person-name-given_name/> 
    <person-name-surname/> 
    <person-name-title/> 
    <person-contactdata/> 
    <person-contactdata-email/> 
    <person-contactdata-office/> 
    <person-contactdata-office-building/> 
    <person-contactdata-office-room/> 
    <person-contactdata-phone/> 
    <person-organization/> 
    <person-organization-group/> 
    <person-organization-department/> 
</shallow> 
+0

ах! Потрясающие!!! Неудивительно, что я не нашел ошибку, когда искал ее в неправильном месте ^^ Большое спасибо! –

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