The following example shows how to define a revolute DoF defined using the Denavit-Hartenberg parameters (theta, d, a and alpha) using URDF in a systematic way.
<link name="base_link">...</link>
<link name="tmp_11">...</link>
<joint name="theta1" type="revolute">
<parent link="base_link"/>
<child link="tmp_11"/>
<axis xyz="0 0 1"/>
<limit effort="1000.0" lower="-3.1415" upper="3.1415" velocity="0.5"/>
<origin rpy="0 0 {{ value_theta1 }}" xyz="0 0 0"/>
</joint>
<link name="tmp_12">...</link>
<joint name="d1" type="fixed">
<parent link="tmp_11"/>
<child link="tmp_12"/>
<origin rpy="0 0 0" xyz="0 0 {{ value_d1 }}"/>
</joint>
<link name="tmp_13">...</link>
<joint name="a1" type="fixed">
<parent link="tmp_12"/>
<child link="tmp_13"/>
<origin rpy="0 0 0" xyz="{{ value_a1 }} 0 0"/>
</joint>
<link name="L1">...</link>
<joint name="alpha1" type="fixed">
<parent link="tmp_13"/>
<child link="L1"/>
<origin rpy="{{ value_alpha1 }} 0 0" xyz="0 0 0"/>
</joint>