Одна из проблем, с которой вы столкнулись, связана с этим выражением ...
<xsl:value-of select="row/row/stuff"/>
В данный момент вы соответствуете элементу row
, поэтому ваше выражение будет относительно этого, поэтому, выполнив row/row
, вы получитеищем элемент grand-child под названием row.Вы действительно просто делаете <xsl:value-of select="row/stuff"/>
Это будет похоже на создание атрибута id
для второго bamboo
.Это должно быть так (я заменил comment_id
на id
, поскольку в вашем XML нет comment_id
)
<bamboo id="{row/id}">
Вторая проблема заключается в том, что в вашем коде предполагается только один дочерний элемент row
элемент, где вы можете иметь несколько.Для создания второго bamboo
и последующих вы должны обернуть его в xsl:for-each
Попробуйте это XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="csv">
<div type="bamboopower">
<xsl:apply-templates select="@* | node()"/>
</div>
</xsl:template>
<xsl:template match="row">
<bamboo id="{id}" more="{more}">
<p><xsl:value-of select="stuff"/></p>
</bamboo>
<xsl:for-each select="row">
<bamboo id="{id}">
<p><xsl:value-of select="stuff"/></p>
</bamboo>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
В качестве альтернативы, вы можете использовать этот подход, который будетудалить дубликаты кодов:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="csv">
<div type="bamboopower">
<xsl:apply-templates select="//row"/>
</div>
</xsl:template>
<xsl:template match="row">
<bamboo id="{id}">
<xsl:if test="more">
<xsl:attribute name="more">
<xsl:value-of select="more" />
</xsl:attribute>
</xsl:if>
<p><xsl:value-of select="stuff"/></p>
</bamboo>
</xsl:template>
</xsl:stylesheet>