2015-06-09 1 views
0

Новичок здесь с XSLT. Я создаю один XML из другого XML. Каждый XML следует за разными XSD, но очень похож. Я предоставляю список необходимых элементов, которые должны присутствовать в окончательном выпуске xml. Поэтому у меня есть xpath всех необходимых элементов. Мой вопрос в том, как я могу гарантировать, что требуемые элементы существуют, а если нет, я должен сгенерировать требуемые элементы в выходном XML-файле.XML-XML с использованием XSLT: как проверить, существует ли элемент в выводе xml, и если не создать элемент со значением по умолчанию

Таким образом, мой подход: быть источником XML и выход XML (целевой XML) будет очень похож с небольшими различиями (XSD на 90% одинаковы). Я сначала копирую весь xml с шаблоном преобразования идентификаторов. Затем мне нужно выполнить некоторую проверку необходимых элементов, чтобы убедиться, что они присутствуют в дереве результатов.

Например:

Учитывая этот XML:

<?xml version="1.0" encoding="UTF-8"?> 
<orders> 
    <order> 
     <order_id>555435699</order_id> 
     <products> 
      <product>Book1</product> 
      <product>Book2</product> 
     </products> 
     <customer> 
      <name>Mike Smith</name> 
      <address>1222 N 1st St, Chicago IL</address> 
     </customer> 
    </order> 
</orders> 

ВЫВОД должно быть что-то вроде:

<?xml version="1.0" encoding="UTF-8"?> 
<orders> 
    <order> 
     <order_id>555435699</order_id> 
     <products> 
      <product>Book1</product> 
      <product>Book2</product> 
     </products> 
     <customer> 
      <name>Mike Smith</name> 
      <address>1222 N 1st St, Chicago IL</address> 
        <phone>555-555-5555</phone> <!-- Required element 'phone' needs to be populated with default value in output if it doesn't exist --> 
     </customer> 
    </order> 
</orders> 

нужно быть уверенным, телефон данные клиента существует или должен быть создан с невыполнением значение «555-555-5555

<xsl:if test="not(node_xpath)"> 
    <!-- need to add the element --> 
</xsl:if> 

Как мы выполняем проверку в xslt, используя «if» и «test». Я видел, как они использовались здесь и там. Сделайте это в отдельном шаблоне, или они должны быть включены. Как это должно применяться для примера выше?

UPDATE:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" indent="yes"/> 

<!-- copy entire xml from source xml file --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 

<!-- need to check for required tags - - HOW TO INTEGRATE THIS PART --> 
<xsl:if test="not(orders/order/customer/phone)"> 
    <phone>555-555-5555</phone> 
</xsl:if> 
</xsl:stylesheet> 
+0

Есть ли у нее быть просто XSLT? Потому что у меня возникнет соблазн предложить предварительную обработку его скриптом. – Sobrique

+0

Можете ли вы опубликовать свой текущий XSLT? –

+0

опубликовал то, что я пытался сделать – user1899872

ответ

1

Просто добавьте шаблон, соответствующий заказ без какого-либо клиента, и он написать клиент по умолчанию результата:

XSLT 1,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:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="order[not(customer)]"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     <customer> 
      <phone>555-555-5555</phone> 
     </customer> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Я думаю, что я не был «Слишком ясно в начале. Скажем, я должен быть уверен, что каждый пользователь имеет данные элемента <phone>. Если нет, то мне нужно, чтобы заполнил это в xml outpu со значением по умолчанию.

Тогда матч клиента, без телефона вместо:

<xsl:template match="customer[not(phone)]"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     <phone>555-555-5555</phone> 
    </xsl:copy> 
</xsl:template> 
+0

Я думаю, что я не был слишком ясен в начале. Предположим, я должен быть уверен, что каждый клиент имеет данные элемента . Если нет, тогда мне нужно заполнить это в xml outpu значением по умолчанию. Я обновил сообщение с ожидаемым результатом вывода. – user1899872

+0

@ user1899872 Затем сопоставьте клиента без телефона - см. Редактирование моего ответа. –

+0

Спасибо, это сработало. – user1899872

-1

Я хотел бы создать template для каждого из требуемых выходных узлов. Вы хотите, чтобы шаблон соответствовал, если не существующий входной узел для копирования. Вы можете вставить результаты по умолчанию для отсутствующих данных в шаблон.

xsl довольно сложный, но очень мощный. Вам нужно будет прочитать документацию, чтобы понять это.

+0

Да, я много слышал о XSLT и о том, как вы могли бы сделать преобразования довольно красиво, но да нужно действительно более внимательно изучить его. – user1899872

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