Я немного огляделся, но не вижу очевидного ответа на свою проблему. Я уверен, что что-то не замечаю, но не знаю что.
Я провел некоторую предварительную обработку приведенного ниже XML, чтобы отредактировать некоторые имена элементов, и после предварительной обработки у меня есть таблица стилей XSL, которая выполняет простое преобразование идентичности. Однако мне интересно, есть ли способ избежать этапа предварительной обработки и выполнить все в одной таблице стилей. Основное различие между двумя входными данными XML состоит в том, что <subj*>
стал <subj>
.
Есть ли способ проверить имя элемента на предмет начального (или, я полагаю, конечного) значения? Большое спасибо за ваше время и предложения.
У меня есть ввод XML, который выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<row>
<issueNumber>1.001</issueNumber>
<subj1>Cats</subj1>
<subj2>LOLCats</subj2>
<subj3>Cheezburgers</subj3>
<subj4></subj4>
</row>
<row>
<issueNumber>2.001</issueNumber>
<subj1>Cats</subj1>
<subj2>LOLCats</subj2>
<subj3>NOMS</subj3>
<subj4>Cheezburger</subj4>
</row>
<row>
<issueNumber>3.001</issueNumber>
<subj1>NOMS</subj1>
<subj2></subj2>
<subj3></subj3>
<subj4></subj4>
</row>
</root>
Я обрабатываю его с помощью следующего XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="row">
<!--<xsl:result-document href="{concat(issueNumber, '.xml')}">-->
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
<!--</xsl:result-document>-->
</xsl:template>
<xsl:template match="issueNumber">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="subj">
<xsl:choose>
<xsl:when test="not(string(.))"></xsl:when>
<xsl:when test="string(.)">
<subject>
<xsl:apply-templates />
</subject>
</xsl:when>
</xsl:choose>
</xsl:template>