2013-06-13 3 views
0

У меня есть XML с фрагментами 2 XML, первый один фрагмент, где должны быть применены новые значения (которые могут иметь довольно сложные элементы), какИзменить текст элементов, определенных с помощью динамического XPath

... some static parents 
<a:element1> 
    <a:subelement tag="someString"> 
     <a:s1>a</a:s1> 
    </a:subelement> 
</a:element1> 
<a:element2>b</a:element2> 
<a:element3>c</a:element3> 
... lots of other elements like the above ones 

и 2 фрагмент, который имеет XPaths сгенерированные из первого XML и новое значение, как

<field> 
    <xpath>/Parent/element1/subelement[@tag="someString"]/s1</xpath> 
    <newValue>1</newValue> 
</field> 
<field> 
    <xpath>/Parent/element2</xpath> 
    <newValue>2</newValue> 
</field> 

Мы не могли бы иметь новые значения применяются для всех элементов в первом фрагменте.

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

Вывод должен быть:

... some static parents 
<a:element1> 
    <a:subelement tag="someString"> 
     <a:s1>1</a:s1> 
    </a:subelement> 
</a:element1> 
<a:element2>2</a:element2> 
... lots of other elements like the above ones 

У меня есть доступ к Xalan: оценка для оценки динамического XPath. Я пробую разные решения, я напишу их здесь, когда они начнут иметь смысл.

Любые идеи подходов хорошо приняты. Благодаря

ответ

0

Oki, я узнал, как и я напишу ответ здесь, может быть, кто-нибудь будет нуждаться в этом:

<xsl:template match="/"> 

<!-- static parents --> 
    <a:Root> 
    <xsl:apply-templates select="/a:Root/a:Parent" /> 
    </a:Root> 

</xsl:template> 

<xsl:template match="@*|*|text()"> 

<xsl:variable name="x" select="generate-id(../.)" /> 
<xsl:variable name="y" select="//field[generate-id(xalan:evaluate(xpath)) = $x]" /> 

<xsl:choose> 
    <xsl:when test="$y"> 
    <xsl:value-of select="$y/newValue" /> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|*|text()" /> 
    </xsl:copy> 
    </xsl:otherwise> 
</xsl:choose> 

</xsl:template> 

И объяснить трансформацию: Я записываю часть, которая является статическим и затем вызовите шаблоны заявки на интересующий фрагмент, который имеет жидкую структуру.

Затем я использую слегка модифицированное преобразование идентичности, которое копирует все из источника в цель (начиная с фрагмента /a: Root/a: Parent), за исключением случаев, когда мы позиционируем себя в интересующем тексте в изменении.

текст() Я заинтересован в будет иметь в качестве родителя (../.) элемент упоминаемый на строку XPATH найденной во втором фрагменте. Переменная x означает, что в контексте , когда, этот элемент.

Переменная у находит поле элемент, который имеет, как ребенок в XPATH элемент, который, если оценены с использованием Xalan будет ссылаться на тот же элемент, что переменная х относится к. Теперь я использовал generate-id(), чтобы сравнить физические элементы, в противном случае это было бы сравнение с toString элемента (что неверно). Если переменная y не существует, это означает, что у меня нет xpath элемент для этого элемента, который мог бы быть изменен, и я оставляю его в покое. Если переменная y существует, я могу получить от нее newValue, и теперь я помещен в элемент, текст которого я хочу обновить.

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