Xslt для создания файла свойств из xml, в котором в качестве имени указан путь к элементам xml, а его значение - в качестве значения - PullRequest
0 голосов
/ 11 мая 2018

Здравствуйте, у меня есть требование, где у меня есть XML-файл (общие имена элементов и узлы могут измениться). Намерение состоит в том, чтобы создать из него файл свойств, где с левой стороны будет абсолютный путь к имени элемента, а с правой стороны - значение для этого элемента. например: -

Если у меня ниже xml: -

<?xml version="1.0" encoding="UTF-8"?>
<group>
<root>
  <child>
    <subchild>xyz</subchild>
  </child>
</root>
<root1>
  <child>
    <subchild>abc</subchild>
  </child>
</root1>
<root2>
  <child>
    <subchild>pqr</subchild>
  </child>
</root2>
<root3>
  <child>
    <subchild>lmn</subchild>
  </child>
</root3>
</group>

тогда вывод должен быть: -

/group/root/child/subchild=xyz
/group/root1/child/subchild=abc
/group/root2/child/subchild=pqr
/group/root3/child/subchild=lmn

Пока что я написал ниже xslt, но он работает неправильно: -

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

    <xsl:output method="text" />

    <xsl:template match="node()">
        <xsl:for-each select="ancestor-or-self::*">
            <xsl:value-of select="concat('/',name(.))"/>
        </xsl:for-each>
<xsl:value-of select="concat('=',.)"/>
        <xsl:text>&#xA;</xsl:text>

        <xsl:apply-templates select="*"/>
    </xsl:template>
</xsl:transform>

любая помощь будет высоко ценится.

thansk.

1 Ответ

0 голосов
/ 11 мая 2018

Вы можете использовать следующие stylesheet для вашего конкретного случая:

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

    <xsl:template match="*">
      <xsl:if test="not(*)">
         <xsl:apply-templates select="ancestor-or-self::*" mode="path"/>
         <xsl:value-of select="concat('=',.)"/>
         <xsl:text>&#xA;</xsl:text>
        </xsl:if>
        <xsl:apply-templates select="*"/>
    </xsl:template>

    <xsl:template match="*" mode="path">
        <xsl:value-of select="concat('/',name())"/>
    </xsl:template>

</xsl:stylesheet>

ВХОД:

more group.xml 
<?xml version="1.0" encoding="UTF-8"?>
<group>
<root>
  <child>
    <subchild>xyz</subchild>
  </child>
</root>
<root1>
  <child>
    <subchild>abc</subchild>
  </child>
</root1>
<root2>
  <child>
    <subchild>pqr</subchild>
  </child>
</root2>
<root3>
  <child>
    <subchild>lmn</subchild>
  </child>
</root3>
</group>

ВЫВОД:

xsltproc pathGen.xsl group.xml
/group/root/child/subchild=xyz
/group/root1/child/subchild=abc
/group/root2/child/subchild=pqr
/group/root3/child/subchild=lmn

Если у вас более сложная структура с атрибутами и несколькими братьями и сестрами, я бы порекомендовал вам адаптировать решение dimitre-novatchev -> Общее решение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...