Я пытаюсь взять данные XML и отсортировать элементы по их атрибуту данных. К сожалению, даты приводятся в формате мм / дд / гггг и не являются статичными длинами. (Jan = 1 вместо 01) Так что я считаю, что строку нужно будет разбить на три компонента и добавить месяц. Вновь объединенное значение (ггггммдд) затем сортируется по убыванию.
Проблема в том, что я понятия не имею, как это сделать. Вот пример данных
<content date="1/13/2011 1:21:00 PM">
<collection vo="promotion">
<data vo="promotion" promotionid="64526" code="101P031" startdate="1/7/2011 12:00:00 AM" type="base"/>
<data vo="promotion" promotionid="64646" code="101P026" startdate="2/19/2011 12:00:00 AM" type=""/>
<data vo="promotion" promotionid="64636" code="101P046" startdate="1/9/2011 12:00:00 AM" type="base"/>
</collection>
</content>
Также можно ли порекомендовать хорошую книгу по изучению XSLT?
Спасибо!
Обновление 1
Мне бы очень хотелось, чтобы у меня было лучшее понимание этого LOL. В любом случае, я использовал предоставленный вами код и добавил код 'value-of', который работал в связанном коде, который вы предоставляете в другом вопросе, и не вижу результатов. В идеале, после того, как это будет отсортировано, мне нужно будет ссылаться на несколько других атрибутов из самого последнего элемента данных.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="http://exslt.org/common">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:variable name="vrtfPass1">
<xsl:apply-templates/>
</xsl:variable>
<xsl:apply-templates mode="pass2" select=
"ext:node-set($vrtfPass1)/*"/>
</xsl:template>
<xsl:template match="@startdate">
<xsl:variable name="vDate" select="substring-before(.,' ')"/>
<xsl:variable name="vYear" select=
"substring($vDate, string-length($vDate) -3)"/>
<xsl:variable name="vDayMonth" select=
"substring-before($vDate, concat('/',$vYear))"/>
<xsl:variable name="vMonth"
select="format-number(substring-before($vDayMonth, '/'), '00')"/>
<xsl:variable name="vDay"
select="format-number(substring-after($vDayMonth, '/'), '00')"/>
<xsl:attribute name="startdate">
<xsl:value-of select="concat($vYear,$vMonth,$vDay)"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="node()|@*" mode="pass2">
<xsl:copy>
<xsl:apply-templates mode="pass2" select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template mode="pass2" match="collection">
<xsl:copy>
<xsl:apply-templates mode="pass2" select="@*"/>
<xsl:apply-templates mode="pass2">
<xsl:sort select="@startdate"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="content/collection/data">
<xsl:if test="position()=1">
<xsl:value-of select="@promotionid"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Обновление 2
Хм, я попытался обновить его, как вы сказали
...
</xsl:template>
<xsl:template mode="pass2" match="content/collection/data">
<xsl:value-of select="@promotionid"/>
</xsl:template>
</xsl:stylesheet>
И я до сих пор не получил никакого вывода. Я немного погуглил, а также попытался возиться с этим объявлением xmlns:ext="http://exslt.org/common"
и попробовал другие значения, основываясь на статье, на которую я смотрел. Я пытался
И ничего не дало выхода. Поэтому мне интересно, если у меня что-то не так или мой процессор xslt не поддерживает это.
Обновление 3
Хорошо, по-видимому, нам неоднократно давали плохую информацию. Я обновил образец XML другим атрибутом, который меняет то, что нужно сделать.
То, что должно произойти, - это отсортировать данные по дате, как мы это уже сделали, а затем извлечь идентификатор самого последнего узла И, имеющего тип = «база». Если ни у одного узла данных нет типа = 'base', мы просто ссылаемся на самый последний узел данных, как у нас уже есть.
Надеюсь, это имеет смысл. И еще раз большое спасибо.