Поиск всех имен элементов со значениями с использованием xslt-кодирования - PullRequest
0 голосов
/ 22 октября 2019

Рассмотрим ниже мой xml, и мне нужно написать xslt, чтобы получить вывод в виде таблицы из двух столбцов. Первый столбец должен содержать имя элемента со значением атрибута, а второй столбец должен содержать значение узла.

Пример: Программа

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xml.xsl"?>
<article>
<front>
    <journal-meta>
        <journal-id journal-id-type="pubmed">Proc Natl Acad Sci U S A</journal-id>
        <journal-id journal-id-type="publisher">PNAS</journal-id>
        <issn>0027-8424</issn>
        <publisher>
            <publisher-name>The National Academy of Sciences</publisher-name>
        </publisher>
    </journal-meta>
    <article-meta>
        <title-group>
            <article-title>The coreceptor mutation</article-title>
        </title-group>
        <contrib-group>
            <contrib contrib-type="author">
                <name>
                    <surname>Sinma</surname>
                    <given-names>Army D.</given-names>
                </name>
            </contrib>
        </contrib-group>
                <p>#x002A; Present address: PMD Centers for Disease Control and Prevention, Portland, OR 97232.</p>
            </fn>
            <corresp id="FN151">#x2020; To whom reprint requests should be addressed. E-mail: <email>kirmanee@ich.edu</email>.</corresp>
            <fn fn-type="com">
                <p>Communicated by avatar Friedman, University of Mann, Minneapolis, MN</p>
            </fn>
        </author-notes>
        <abstract>
            <p>We explore the impact of a host genetic factor on heterosexual HIV epidemics by using a deterministic mathematical model.</p></abstract>
        </article-meta>
    </front>
    <body>
        <p>Nineteen million people have</p>
        <p>To exemplify the contribution</p>
        <sec>
            <title>The Model</title>
            <p>Because we are most concerned </italic>(<italic>t</italic>)#x005D;</p>
    </sec>
</body>
</article>

XSLT-код пытался

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="article">
<table border="1">
<tr bgcolor="#9acd32">
<th style="text-align:left">ELEMENT</th>
<th style="text-align:left">VALUE</th>
</tr>
<xsl:for-each select="*/*">
<xsl:for-each select="*">
<tr>
<td><xsl:value-of select="local-name()"/>=> </td>
<td><xsl:value-of select="."/></td></tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Ожидаемый вывод должен быть в следующем формате:

Element------Value
journal-id journal-id-type="pubmed----Proc Natl Acad Sci U S A
journal-id journal-id-type="publisher"---PNAS
issn----0027-8424
.
.
p------Nineteen million people have
p----To exemplify the contribution

Пожалуйста, помогите мне получить правильный код

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

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

<xsl:output method="text" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
  <xsl:text>Element------Value&#xa;</xsl:text>
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="text()">
    <xsl:value-of select="concat(name(parent::*), '-----', .)"/><xsl:text>&#xa;</xsl:text>
</xsl:template>
0 голосов
/ 22 октября 2019

Рассмотрим следующий пример:

XML (я не использую ваш, потому что он плохо сформирован)

<article>
  <front>
    <journal-meta>
      <journal-id journal-id-type="pubmed">Proc Natl Acad Sci U S A</journal-id>
      <journal-id journal-id-type="publisher">PNAS</journal-id>
      <issn>0027-8424</issn>
      <publisher>
        <publisher-name>The National Academy of Sciences</publisher-name>
      </publisher>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>The coreceptor mutation</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <name>
            <surname>Sinma</surname>
            <given-names>Army D.</given-names>
          </name>
        </contrib>
      </contrib-group>
      <p>#x002A; Present address: PMD Centers for Disease Control and Prevention, Portland, OR 97232.</p>
      <corresp id="FN151">#x2020; To whom reprint requests should be addressed. E-mail: <email>kirmanee@ich.edu</email>.</corresp>
      <fn fn-type="com">
        <p>Communicated by avatar Friedman, University of Mann, Minneapolis, MN</p>
      </fn>
      <abstract>
        <p>We explore the impact of a host genetic factor on heterosexual HIV epidemics by using a deterministic mathematical model.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <p>Nineteen million people have</p>
    <p>To exemplify the contribution</p>
  </body>
</article>

XSLT 1.0

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

<xsl:template match="/">
    <table border="1">
        <tr>
            <th>ELEMENT</th>
            <th>VALUE</th>
        </tr>
        <xsl:for-each select="//text()">
            <tr>
                <td>
                    <xsl:value-of select="name(..)"/>
                    <xsl:variable name="attr" select="../@*" />
                    <xsl:if test="$attr">
                        <xsl:text>[</xsl:text>
                        <xsl:value-of select="name($attr)"/>
                        <xsl:text>=</xsl:text>
                        <xsl:value-of select="$attr"/>
                        <xsl:text>]</xsl:text>
                    </xsl:if>
                </td>
                <td>
                    <xsl:value-of select="."/>
                </td>
            </tr>
        </xsl:for-each>
    </table>    
</xsl:template>

</xsl:stylesheet>

Результат (предоставлен)

enter image description here

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