Я пытаюсь преобразовать старые файлы XML в новую улучшенную структуру. Частично мне нужно, чтобы я обернул некоторые свободные элементы в родительский контейнер, а также изменил их дочерние элементы.
Старая структура
<monograph>
<title>asdf</title>
<dosage.sec id="dosage.sec.1">
<dosage.sec>asgfd</dosage.sec>
<dosage.sec>asgfd</dosage.sec>
</dosage.sec>
<dosage.sec id="dosage.sec.2">
<dosage.sec>asgfd</dosage.sec>
<dosage.sec>asgfd</dosage.sec>
</dosage.sec>
<dosage.sec id="dosage.sec.3">
<dosage.sec>asgfd</dosage.sec>
<dosage.sec>asgfd</dosage.sec>
</dosage.sec>
<products>
<prod>sadf</prod>
<prod>sadf</prod>
</products>
</monograph>
Новая структура
<monograph>
<title>asdf</title>
<dosage>
<dosage.sec id="dosage.sec.1">
<dosage.qual>asgfd</dosage.qual>
<dosage.qual>asgfd</dosage.qual>
</dosage.sec>
<dosage.sec id="dosage.sec.2">
<dosage.qual>asgfd</dosage.qual>
<dosage.qual>asgfd</dosage.qual>
</dosage.sec>
<dosage.sec id="dosage.sec.3">
<dosage.qual>asgfd</dosage.qual>
<dosage.qual>asgfd</dosage.qual>
</dosage.sec>
</dosage>
<products>
<prod>sadf</prod>
<prod>sadf</prod>
</products>
</monograph>
Я нашел этот ответ и изменил это немного соответствует моим потребностям:
<!-- wrap dosage.sec elements in a dosage container -->
<xsl:template match="node()|@*" name="dosage.sec">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="monograph/dosage.sec[not(preceding-sibling::*[1][self::dosage.sec])]">
<dosage>
<xsl:call-template name="dosage.sec" />
<xsl:apply-templates mode="copy" select="following-sibling::*[1][self::dosage.sec]" />
</dosage>
</xsl:template>
<xsl:template match="monograph/dosage.sec" mode="copy">
<xsl:call-template name="dosage.sec"/>
</xsl:template>
<!-- rename children dosage.sec -->
<xsl:template match="dosage.sec/dosage.sec">
<dosage.qual>
<xsl:apply-templates />
</dosage.qual>
</xsl:template>
Но мой вывод:
<monograph>
<title>asdf</title>
<dosage>
<dosage.sec id="dosage.sec.1">
<dosage.qual>asgfd</dosage.qual>
<dosage.qual>asgfd</dosage.qual>
</dosage.sec>
<dosage.sec id="dosage.sec.2">
<dosage.qual>asgfd</dosage.qual>
<dosage.qual>asgfd</dosage.qual>
</dosage.sec>
<dosage.sec id="dosage.sec.3">
<dosage.qual>asgfd</dosage.qual>
<dosage.qual>asgfd</dosage.qual>
</dosage.sec>
</dosage>
<dosage.sec id="dosage.sec.3">
<dosage.qual>asgfd</dosage.qual>
<dosage.qual>asgfd</dosage.qual>
</dosage.sec>
<products>
<prod>sadf</prod>
<prod>sadf</prod>
</products>
</monograph>
Я использую встроенный в PHP5 объект XSLTProcessor — все XML и XSL имеют версию 1.0.
[1]
из этой строки:<xsl:apply-templates mode="copy" select="following-sibling::*[1][self::dosage.sec]" />
, но то, как вы это делаете, может быть не лучшим подходом. - person JLRishe   schedule 05.03.2013