2014-11-14 3 views
0

Я новичок в XSLT, и я пытаюсь преобразоватьКак игнорировать группу элементов, если конкретный узел не существует XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<file> 
<files> 
<segmentpair> 
<source>2. als Vertreter der xxxx ein Professor der Materialwissenschaft oder der Engineering Science und</source> 
<target>2. as a representative of the University of xxxxx, a professor of materials science or engineering science</target> 
<Comments> 
<Comment>[xxx 09.01.2014 15:09:23] some comment on the translation</Comment> 
</Comments> 
</segmentpair> 
</files> 
</file> 

в

<Feedback>[xxx 09.01.2014 15:09:23] some comment on the translation</Feedback> 
<Source>2. als Vertreter der xxxx ein Professor der Materialwissenschaft oder der Engineering Science und</Source> 
<Target>2. as a representative of the University of xxxxx, a professor of materials science or engineering science</Target> 

Я просто не уверен, что использовать, чтобы не отображать целевые и исходные элементы, если комментариев нет. Для каждого и если? Этот код был просто идеей проверить, существует ли узел, но я не думаю, что это правильный путь, и он не работает.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <xml:output method="xml" version="1.0" indent="yes"/> 
    <xsl:template match="/"> 
     <document> 

      <xsl:for-each select="/files/file/segmentpair"> 
      <xsl:if test="Comments"> 
      <feedback> 
       <xsl:value-of select="Comments/comment"/> 
      </feedback> 

     </xsl:if> 
     </xsl:for-each> 
     </document>  
    </xsl:template> 
</xsl:stylesheet> 

Я был бы очень благодарен за помощь, я прочитал много примеров здесь, но у меня есть точка, где я не могу работать из наиболее эффективного способа, я думаю, что я мог упустить что-то проще с XSLT 2.0.

Благодаря D.

+0

Ваш вопрос непонятен. Если комментариев нет, и вы не хотите отображать целевые и исходные элементы в таком случае, то каков должен быть фактический вывод? - Обратите также внимание на то, что на выходе, который вы показываете, отсутствует корневой элемент, поэтому не сформирован XML. –

+0

Извините за неясность, я хотел, чтобы документ был корневым элементом, и только для документа, который будет показан, если бы не было комментариев, точно, как вы ответили. Я многому научился от вашего ответа, благодаря чему так много. – user2564684

ответ

0

Я предполагаю, что Вы хотите что-то вроде:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/"> 
    <document> 
     <xsl:for-each select="file/files/segmentpair[Comments/Comment]"> 
      <xsl:apply-templates select="Comments/Comment"/> 
      <xsl:copy-of select="source|target"/> 
     </xsl:for-each> 
    </document>  
</xsl:template> 

<xsl:template match="Comment"> 
    <feedback> 
     <xsl:value-of select="."/> 
    </feedback> 
</xsl:template> 

</xsl:stylesheet> 

Прикладная на вашем примере входных данных, то результат будет:

<?xml version="1.0" encoding="UTF-8"?> 
<document> 
    <feedback>[xxx 09.01.2014 15:09:23] some comment on the translation</feedback> 
    <source>2. als Vertreter der xxxx ein Professor der Materialwissenschaft oder der Engineering Science und</source> 
    <target>2. as a representative of the University of xxxxx, a professor of materials science or engineering science</target> 
</document> 

Если нет Comment элемент не является настоящего, результат будет:

<?xml version="1.0" encoding="UTF-8"?> 
<document/> 

Если найдено несколько элементов Comment, каждый из них будет выводиться как элемент feedback.

Обратите внимание, что XML чувствителен к регистру: comment - это не то же самое, что и Comment.

Смежные вопросы