#xslt #loops #nested
#xslt #циклы #вложенный
Вопрос:
Я пытался выполнить вложенный цикл в файле XSL, но застрял после нескольких попыток
Мой XML-файл выглядит следующим образом
<chromosome cnumber="X" cstart="10000" cend="1000000">
<gene>
<gname>ENSG00000216667</gname>
<gstart>100411</gstart>
<gend>102713</gend>
<external_ref>
<one>OTTG:OTTHUMG00000046372</one>
<two>HGNC:CXYorf11</two>
<three>HGNC_curated_gene:CXYorf11</three>
</external_ref>
<transcript>
<tname>ENST00000406851</tname>
<tstart>100411</tstart>
<tend>102713</tend>
<tstrand> 1</tstrand>
</transcript>
</gene>
<gene>
<gname>ENSG00000182378</gname>
<gstart>122990</gstart>
<gend>150024</gend>
<external_ref>
<one>UCSC:uc004cpa.1</one>
<two>UCSC:uc004cpb.1</two>
<three>HGNC:PLCXD1</three>
<four>HGNC_automatic_gene:PLCXD1</four>
</external_ref>
<transcript>
<tname>ENST00000381657</tname>
<tstart>127860</tstart>
<tend>150024</tend>
<tstrand> 1</tstrand>
</transcript>
<transcript>
<tname>ENST00000399012</tname>
<tstart>122990</tstart>
<tend>150021</tend>
<tstrand> 1</tstrand>
</transcript>
<transcript>
<tname>ENST00000381663</tname>
<tstart>122992</tstart>
<tend>150021</tend>
<tstrand> 1</tstrand>
</transcript>
</gene>
<gene>
<gname>ENSG00000214798</gname>
<gstart>148481</gstart>
<gend>149027</gend>
<external_ref>
<one>UCSC:uc004cpc.1</one>
<two>Clone_based_ensembl_gene:BX000483.7</two>
</external_ref>
<transcript>
<tname>ENST00000399005</tname>
<tstart>148481</tstart>
<tend>149027</tend>
<tstrand> 1</tstrand>
</transcript>
</gene>
<gene>
<gname>ENSG00000178605</gname>
<gstart>150026</gstart>
<gend>160887 </gend>
<external_ref>
<one>UCSC:uc004cpe.1</one>
<two>HGNC:GTPBP6</two>
<three>HGNC_automatic_gene:GTPBP6</three>
</external_ref>
<transcript>
<tname>ENST00000326153</tname>
<tstart>150026</tstart>
<tend>160887</tend>
<tstrand>-1</tstrand>
</transcript>
</gene>
<gene>
Здесь я попробовал XSLT таким образом
<xsl:for-each select="chromosome/gene">
Name: <xsl:value-of select="gname" /> <br />
Start Region: <xsl:value-of select="gstart" /> <br />
End Region: <xsl:value-of select="gend" /> <br />
<xsl:value-of select="external_ref/one "/><br />
<xsl:value-of select="external_ref/two "/>
<xsl:if test="external_ref/three !=' '"><br/>
<xsl:value-of select="external_ref/three "/>
</xsl:if>
<xsl:if test="external_ref/four !=' '"><br/>
<xsl:value-of select="external_ref/four "/>
</xsl:if>
<xsl:for-each select="chromosome/gene/transcript">
Name:<xsl:value-of select="tname" /></strong> <br />
Start Region: <xsl:value-of select="tstart" /> <br />
End Region: <xsl:value-of select="tend" /> <br />
Strand: <xsl:value-of select="tstrand" />
</xsl:for-each>
</xsl:for-each>
Проблема в том, что я не получаю никакой расшифровки; когда я использую только одну для каждого цикла вверху, я получаю только одну расшифровку, не целую, из списка xml
Ребята, можете ли вы указать на мою ошибку, я совершенно новичок в XSLT.
Спасибо
Комментарии:
1. Пожалуйста, обратите внимание, что ваш исходный XML неправильно сформирован.
2. И теперь, когда я присмотрелся повнимательнее, ваш XSLT тоже не является
3. Хорошо сформирован в том смысле, что нет отступов?
4. @thchand — …в том смысле, что есть закрытие
</strong>
без соответствующего начального тега в XSLT и пара элементов в исходном XML, которые не закрыты.5. @thchand: Также обратите внимание, что эти вложенные
xsl:for-each
инструкции не соответствуют правильному стилю XSLT. Вам нужно узнать о сопоставлении шаблонов.
Ответ №1:
С внешним <xsl:for-each
циклом вы уже находитесь на уровне хромосомы / гена. Думайте об этом как о «переходе в этот каталог» в файловой системе.
Если вы хотите получить расшифровку изнутри, вам нужно только выбрать это, например:
<xsl:for-each select="transcript">
Комментарии:
1. Спасибо, теперь я понял. Но не удалось проголосовать из-за репутации
2. @thchand — вы можете согласиться, хотя — даже с низкой репутацией — нажав на галочку. Если я правильно помню, вы даже получите значок за это 🙂